最近在看《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 = new DoSmth<>(); //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 }
在Android中,后台类会使用下面的代码让主线程的handler处理后台接口类中定义的工作
1 mMainHandler.post(new Runnable() { 2 public void run(){ 3 do1.onDo(t); 4 } 5 });
以上就是我分析的一些细节,可能有不对的地方,先记下,以后方便复习更正。