在研究 seafile 的 TaskDialog source code 時,發現一個有趣的寫程式小巧技,如何傳要執行的function 給某個 class.
下面的節錄重點的code:
使用範例,在主程式這樣寫:
NewDialog dialog = new NewDialog();
dialog.init(message);
dialog.setTaskDialogLisenter(new TaskDialog.TaskDialogListener() {
@Override
public void onTaskSuccess() {
//Your code here...
}
});
在 class 裡這樣寫:
public void setTaskDialogLisenter(TaskDialogListener listener) {
mListener = listener;
}
public static abstract class TaskDialogListener {
public void onTaskSuccess() {
}
public void onTaskFailed(SeafException e) {
}
public void onTaskCancelled() {
}
}
最後,在 class 的Task 成功或失敗時,都去呼叫一下 mListener
public void onTaskSuccess() {
getDialog().dismiss();
if (mListener != null) {
mListener.onTaskSuccess();
}
}
public void onTaskFailed(SeafException e) {
hideLoading();
showError(getErrorFromException(e));
enableInput();
if (mListener != null) {
mListener.onTaskFailed(e);
}
}
source code:
https://github.com/haiwen/seadroid/blob/master/app/src/main/java/com/seafile/seadroid2/ui/dialog/TaskDialog.java
