在研究 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