android 非同步回撥機制
阿新 • • 發佈:2019-01-29
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");
}
}