2016年3月4日 星期五

Android 開發筆記 - 使用 Java Reflection 製作 Event Handler 流程控制

在 Android 上練習一些題目時,有碰到一連串 function call 的需求,特別是把每項工作做成 RISC 架構後,出現了重複使用的可能性,假設有 A, B, C, D 四個函式,有時任務是 A->B->D,有時是 B->C->A 的流程,這時就想找一個可以彈性設置任務流程的機制,有一點像 C/C++ 的 function pointer 或 virtual function 可以動態決定對象的機制,就隨意亂打關鍵字,想知道有沒可能得知 function name 後可以呼叫 function 做事,就找到 Java Reflection :http://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html

於是乎,在 Java 環境中透過 ArrayList 記錄此次工作依序將執行的任務,每次挑一個出來用,就達成任務了 :P

紀錄一下(此例各個函式在此例沒有傳遞參數):

class Job {
private String tag = "Job";
private List<String> mFunctionNameList = new ArrayList<String>();

void callFunctions() {
if (mFunctionNameList.size() > 0) {
String methodName = mFunctionNameList.get(0);
mFunctionNameList.remove(0);
try {
Job.this.getClass().getDeclaredMethod(methodName).invoke(this);
} catch (Exception e) {
}
}
}

// call A -> C -> D
void task1() {
mFunctionNameList.clear();
mFunctionNameList.add("A");
mFunctionNameList.add("C");
mFunctionNameList.add("D");
callFunctions();
}

// call B -> C -> A
void task2() {
mFunctionNameList.clear();
mFunctionNameList.add("B");
mFunctionNameList.add("C");
mFunctionNameList.add("A");
callFunctions();
}

void A() {
Log.d(tag, "call A");
}
void B() {
Log.d(tag, "call B");
}
void C() {
Log.d(tag, "call C");
}
void D() {
Log.d(tag, "call D");
}
}

沒有留言:

張貼留言