1. 程式人生 > >Android 開子執行緒工作並用監聽器傳回結果到主執行緒--子執行緒與主執行緒通訊

Android 開子執行緒工作並用監聽器傳回結果到主執行緒--子執行緒與主執行緒通訊

最近研究別人的程式碼,看到其開多執行緒進行工作,並且將結果通過監聽器的方式返回給UI執行緒,程式碼很管用,也容易理解,所以就先記下來

  • 寫一個介面做為監聽器(WorkListener),裡面可以有多個方法,用於對應子執行緒工作不同的事件,如onStart(),onResult(),onStop(),等待

  • 寫一個類(Work),在該類中寫一個工作執行緒繼承自Thread(WorkThread),在該WorkThread中寫入用於工作執行緒的程式碼。

    – 在Work類中新增一個HashSet()
    private final Collection<WorkListener> listeners = new HashSet();

    – 在Work類中新增addWorkListener(WorkListener)方法

    public void addWorkListener(WorkListener listener) {
    Collection var2 = this.listeners;
    synchronized(this.listeners) {
    this.listeners.add(listener);
    }
    }

    – 在Work類中寫一個抽象類繼承自Runnable用在事件處理

    private abstract class WorkEvent implements
    Runnable {
    private WorkEvent () { } public void run() { WorkListener[] emptyArray = new WorkListener[0]; WorkListener[] var2 = (WorkListener[]) this.listeners.toArray(emptyArray); int var3 = var2.length; for(int var4 = 0; var4 < var3; ++var4) { WorkListener listener = var2[var4]; this
    .execute(listener); } } protected abstract void execute(WorkListener listener); }

    – 在Work類中根據需要寫幾個類繼承自WorkEvent來實現各個事件,如ResultEvent

    private class ResultEvent extends Work.WorkEvent {
    
        private final Object result;
    
        ResultEvent(Object result) {
            super();
    
            this.result= result;
    
        }
    
        protected void execute(WorkListener listener) {
    
                listener.onResult(this.result); 
        }
    }

– 在Work類中,建立一個Handler,用於將工作執行緒的資料傳送到主執行緒

private final Handler mainHandler = new Handler(Looper.getMainLooper());

– 自此,監聽器就寫好了,接下來就是在工作執行緒(WorkThread)中利用監聽器去傳遞各個事件(onResult,onStop等)了

WorkThread extends Thread {

  public void run() {
    ...

    String result="這是結果"; 

                                 Work.this.mainHandler.post(Work.this.new   ResultEvent(result));

    ...
  }
}