《Android》『Enum』- 如何透過 Enum 來控管程式的狀態
《Android Developers 參考文獻》
《簡單介紹》
Enum 是列舉的意思,從實務上來看,我們常常利用它來定義一個物件的不同狀態,或者是程式碼執行過程中的不同階段,透過 Enum 宣告的方式,我們可以把一些原本用常數判斷的狀態賦予意義,讓程式開發者在使用時可以更直覺的使用。
《Enum 的使用方式》
這邊我們重新實作一次 Handler 文章中所用的程式碼範例,以完成一個 ProgressBar 進度條,首先,我們必須宣告一個用來表示各個狀態的 Enum 類別,程式碼如下 –
1 2 3 4 5 6 7 8 9 10 |
public static enum Messages { StartProgress(1), Progressing(2), ProgressComplete(3); private int value; private Messages(int value){ this.value = value;} //建構子 - 設定 Messages 狀態的方法 public int value(){ return this.value; } //取得 Messages 狀態的方法 } |
Messages Enum
在 enum 裡面所宣告的成員皆為一個相同類型的常量,在這裡我們將它設為常數,因此我們在宣告的同時可以定義每個成員的值,這邊我們分別定義了三個成員來代表程式在不同階段的狀態,並定義了設定與取得 Message 狀態的兩個方法。
接著,宣告一個繼承 Handler 的類別,自訂其名稱為 MainHandler,程式碼片段如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class MainHandler extends Handler { @Override public void handleMessage(Message msg) { if(msg.what == Messages.StartProgress.value()) { mProgress.setVisibility(View.VISIBLE); } else if(msg.what == Messages.Progressing.value()) { Bundle bData = msg.getData(); int progressValue = bData.getInt("progress_value"); mProgress.setProgress(progressValue); } else if(msg.what == Messages.ProgressComplete.value()) { mProgress.setVisibility(View.INVISIBLE); } } } |
MainHandler.class
我們自訂了一個名為 MainHandler 的類別,並在裡面的 handleMessage(Message msg) 中,定義了接收到不同的 msg.what 所要執行的動作,其中 msg 亦可以透過夾帶 bundle 的方式,帶入所需的參數。
最後,我們新增一個子線程(mThread),並宣告一個基於 MainHandler 類別的物件 mMainHandler,程式碼片段如下 –
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 |
private MainHandler mMainHandler = new MainHandler(); private void sendHandler(HandlerMessages pType, Bundle pData) { if(mMainHandler != null) { try { Message msg = new Message(); if(pData != null) { msg.setData(pData); } msg.what = pType.value; mMainHandler.sendMessage(msg); } catch(Exception e) { Log.e(SysName, SysName + JavName + "sendHandler(),m=" + e.getMessage() + "s=" + e.getStackTrace()); } } } public class mThread extends Thread { int i = 0; @Override public void run() { sendHandler(Messages.StartProgress, null); //透過 sendHandler 告知現在的狀態 while(i != 100) { try { Bundle bundle = new Bundle(); bundle.putInt("progress", i); sendHandler(Messages.Progressing, bundle); //透過 sendHandler 告知現在的狀態 Thread.sleep(500); i++; } catch(Exception e) {e.printStackTrace();} } sendHandler(Messages.ProgressComplete, null); //透過 sendHandler 告知現在的狀態 } } . . . new mThread.start(); |
狀態控管機制
在之前的例子中,我們透過 sendMessage() 與 sendEmptyMessage() 的方式,分別處理帶有參數以及沒有帶參數的狀態回傳,程式碼不免有些冗長,這邊我們自行定義了一個 sendHandler(Messages status, Bundle data) 方法,一次處理掉兩種狀況,若是沒有帶參數,則在 bundle 欄位傳入 null 即可。
臉書留言
一般留言