《Android》『Interface』- 利用 Interface 為類別定義 Callback 機制
《簡單介紹》
在開發 android 程式專案的過程中,我們通常都會有一個習慣,就是將特定的功能模組化,意思就是假設當我們需要執行某些方法或流程的時候,將這些方法或流程特別寫成一個類別,方便讓我們在 MainActivity 以物件導向的方式,調用該類別以執行所需的功能,這麼做的好處是增加了程式的靈活度,且使程式碼更容易閱讀。
當我們把特定功能模組化以後,在程式執行到此功能時,勢必會跑到我們模組化後的類別中,有時我們必須讓程式碼的流程在特定的時候可以回到 MainActivity 中,以繼續其他的流程,這個時候,透過 Interface 來定義 Callback 機制就是一個很不錯的方式。
《實作方法》
這邊簡單講解實作的方式,程式碼片段如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
public class DoSomethingUtil { private Context mContext; private static DoSomethingUtil instance; public enum STATUS_TYPE { STATUS_01("STATUS_01"), STATUS_02("STATUS_02"), STATUS_03("STATUS_01"); private String name; @Override public String toString(){return name;} STATUS_TYPE(String name){this.name = name;} } private DoSomethingUtil(Context context){ mContext = context; } static DoSomethingUtil getInstance(Context context){ if(instance == null) instance = new DoSomethingUtil(context); return instance; } //自訂方法1 public static void doMethod01(STATUS_TYPE status, DoSomethingCallback callback, Context context){ ... getInstance(context).doMethodwithCallback(callback); } //自訂方法2 public static void doMethod02(DoSomethingCallback callback, Context context){ ... getInstance(context).doMethodwithCallback(callback); } //定義了 onMessageReceived 的方法,透過此方法可將流程導回使用此類別的地方 public static void doMethodWithCallback(DoSomethingCallback callback){ final DoSomethingCallback localCallback = callback; if(...){ //Item 為自訂類別,實際使用時可以根據不同條件定義其內容 localCallback.onMessageReceived(new Item); } else if(...){ //Item 為自訂類別,實際使用時可以根據不同條件定義其內容 localCallback.onMessageReceived(new Item); } } //定義介面,在使用此類別時才實際定義內容。 public interface DoSomethingCallback{ void onMessageReceived(Item item); } } |
DoSomethingUtil.java
首先,我們宣告了一個名為 DoSomethingUtil 的類別,表示我們將透過實作此類別的方法來完成一些事情,我們在這個類別裡定義了 private 權限的建構子與 getInstance 方法,表示在使用此類別產生的物件時,我們希望這個物件是唯一的,接著定義了三個 static 方法,這麼做即表示我們不需另外宣告基於此類別的物件,就可以直接使用類別裡面的方法,接著我們定義了 DoSomethingCallback 這個介面,並透過此介面回傳自定義的資料類別 Item,最後,透過 doMethodWithCallback 這個方法,定義在不同條件時呼叫 DoSomethingCallback 介面的onMessageReceived,這麼一來,當我們在 MainActivity 中實作好 DoSomethingCallback 介面的內容後,我們就可以藉由 doMethodWithCallback 將流程導回 MainActivity 中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
//須將 DoSomethingUtil 相關 import import com.xylon.DoSomethingUtil; import com.xylon.DoSomethingUtil.DoSomethingCallback; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { //透過呼叫 DoSomethingUtil 中定義的方法,執行所需的工作(亦可藉此傳遞所需資訊) if(...){ DoSomethingUtil.doMethod01(STATUS_TYPE.STATUS_01, mDoSomethingCallback, MainActivity.this); } else{ DoSomethingUtil.doMethod02(mDoSomethingCallback, MainActivity.this); } } . . . //透過實作 DoSomethingUtil 類別中定義的 DoSomethingCallback 介面,達到傳回值的效果 DoSomethingCallback mDoSomethingCallback = new DoSomethingCallback() { @Override public void onMessageReceived(Item item) { if(item != null) { ... } else{ ... } } }; } |
MainActivity.java
在 MainActivity 中,我們透過直接呼叫 DoSomethingUtil 類別中所定義的 static 方法,以及實作 DoSomethingUtil 類別中所定義的 DoSomethingCallback 介面,搭起 MainActivity 與 DoSomethingUtil 類別之間的橋樑,我們可以自行決定何時從 MainActivity 呼叫 DoSomethingUtil 類別中方法,也可以決定在何時要從類別發 Callback 給 MainActivity,並且傳遞程式執行時所需的資訊。
臉書留言
一般留言