關於接口回調的分析
阿新 • • 發佈:2018-01-11
圖片 自己 color 內部類 模型 例如 post android中 per
最近在看《Android編程權威指南(第2版)》,看到24章的時候碰到一個問題,在後臺線程中使用接口把後臺的某種任務(例如下載後圖片的處理)交付給前臺線程(或者叫做UI線程或主線程)。
android使用的是Handler.post(Runnable)方法:
1 Runnable myRunnable = new Runnable() { 2 @Override 3 public void run() { 4 /* Your code here */ 5 } 6 }; 7 Message m = mHandler.obtainMessage(); 8 m.callback = myRunnable;
Message設有回調方法時,它從消息隊列取出後,是不會發給target Handler(目標Handler)。相反,存儲在回調方法中的Runnable的run()會直接執行。
對於類內部的接口處理某個問題我還是沒太明白,後來用java來做了個類似的例子。
在這裏,主類是InnerInterfaceTest 類似於Android的主線程,主類自帶一個內部類A用於定義一個模型(存儲一種數據)。下面是主類的代碼:
1 public class InnerInterfaceTest { 2 3 private static DoSmth<A> mDoSmth = newDoSmth<>(); //DoSmth<A> 是泛型類 A是自帶的模型類 4 static A a = new InnerInterfaceTest().new A("a string");//初始化模型類A的變量 a 5 6 public static void main(String[] args) { 7 //在這裏通過調用setDo方法,可實例化DoSmth<T>類中的接口Do<T>,並且implements接口的方法,達到讓 8 //後臺類DoSmth<T>的工作交由前臺類InnerInterfaceTest進行處理9 //實現接口的方法onDo(A t),在這裏,我們定義了前臺線程的處理是對A的對象的成員m進行打印處理 10 //還可以定義成別的處理方式,具體可以自己寫。在這裏我們就實現了將後臺線程轉到前臺進行單獨處理。 11 mDoSmth.setDo(new DoSmth.Do<A>(){ 12 public void onDo(A t){ 13 Printer.P(t.m); 14 } 15 }); 16 //上面實例化了接口DoSmth.Do<T>並實現了onDo方法,且已將實例後的接口對象傳給了後臺類的Do<T> do1 17 mDoSmth.DoCall(a); //調用方法1:使用後臺類的方法DoCall對模型類A進行處理 18 mDoSmth.do1.onDo(a);//調用方法2:使用實例後的do1的方法onDo對模型類A進行處理 19 } 20 21 22 public class A{ 23 String m; 24 25 public A(String str){ 26 m = str; 27 } 28 } 29 }
在這裏,我們使用 mDoSmth.DoCall(a); 或 mDoSmth.do1.onDo(a); 主動調用後臺的方法。雖然Android中這個工作由主線程的Handler和Looper來自動處理。
而後臺的類我們定義如下:
1 public class DoSmth<T> { 2 3 public Do<T> do1; 4 5 interface Do<T>{ 6 void onDo(T t); 7 } 8 9 public void setDo(Do<T> d){ 10 do1 = d; 11 } 12 13 public void DoCall(T t) 14 { 15 do1.onDo(t); 16 } 17 }DoSmth.java
在Android中,後臺類會使用下面的代碼讓主線程的handler處理後臺接口類中定義的工作
1 mMainHandler.post(new Runnable() { 2 public void run(){ 3 do1.onDo(t); 4 } 5 });View Code
以上就是我分析的一些細節,可能有不對的地方,先記下,以後方便復習更正。
關於接口回調的分析