android 異步回調機制

jopen 10年前發布 | 51K 次閱讀 Android Android開發 移動開發

android事件處理:
基于監聽,基于回調。
基于監聽,是為android界面組件綁定特定的事件監聽器。主要處理一些特定的事件。
基于回調,時重寫android組件特定的回調方法,或者重寫activity的回調方法。android為絕大部分界面組件都提供了事件響應的回調方法。可以用于處理一些具有通用性的事件。

對于基于監聽的事件處理模型來說,事件源和事件監聽器是分離的,當事件源上發生特定事件之后,該事件交給事件監聽器負責處理,對于基于回調的事件處理模型來說,事件源和事件監聽器時統一的,當時間源發生特定事件之后,該事件還是有事件源本身負責處理。
例如:boolean onKeyMultiple(int keyCode,int repeateCount,KeyEvent event)用于響應按鍵重復點擊。官方API支出,它總是返回false,沒有handle,必須重寫才能實現。

委托機制需要事件源,事件和監聽。而回調機制難以理解,網上通俗的說法是:A類持有B類引用,A調用B的方法C,然后B類中反過來調用A類中的方法D,D就叫回調方法。其實D正是回調接口中的方法。

根據這種思路的理解,我寫了個簡單的示例,方便自己了解。

A有一個策劃方案,需要B去完成。B還有其他工作要做,只有做完了才能去做這個策劃方案。B完成策劃方案后,調用A的方法,把方案交給A。

A類:需要實現回調接口,并調用B的一個方法

    public class A implements CallBack{  
        /**  
         * A類持有B類的一個引用  
         */  
        private B b;  
        public A(B b){  
            this.b=b;  
        }  
        /**  
         * 執行異步任務的方法  
         * @param ask  
         */  

        public void ask(final String ask){  
            //模擬異步任務,同時進行兩項任務  
            new Thread(new Runnable() {  

                @Override  
                public void run() {  
                    //1   調用B類方法,完成獲取方案  
                    b.excuteMessage(A.this, ask);  
                    //2   執行其他任務  
                    task();  
                }  
            }).start();  
        }  
        /**  
         * 其他任務  
         */  
        public void task(){  
            System.out.println("---------");  
        }  

        /**  
         * 得到解決方案  
         * 回調方法  
         */  
        @Override  
        public void sovle(String result) {  
            System.out.println(result);  
        }  
    }  

B類:被調用的方法需要帶有一個回調接口的參數,并調用A類的一個方法(回調方法)

    public class B {  

        /**  
         * 接口做參數的方法  
         * @param cb 回調接口  
         * @param ask 問題  
         */  
        public void excuteMessage(CallBack cb,String ask){  
            System.out.println("問題是:"+ask);  
            //經過一段時間,方案已產生  
            String result = "方案1";  
            //B類中反過來調用A類中的方法  
            cb.sovle(result);  
        }  
    }  

回調接口:
    /**  
     * 回調接口  
     * @author DB  
     *  
     */  
    public interface CallBack {  

        /**  
         * 回調方法  
         * @param result  
         */  
        public void sovle(String result);  
    }  

main:
public class Test {  

    public static void main(String[] args) {  
        B b = new B();//B類注冊回調方法  
        A a = new A(b);//A類實現回調接口  
        //A類引用調用自身方法  
        a.ask("ask");  
    }  
}  
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!