关于接口回调的分析

最近在看《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 }
DoSmth.java

 在Android中,后台类会使用下面的代码让主线程的handler处理后台接口类中定义的工作

1 mMainHandler.post(new Runnable() {
2     public void run(){
3         do1.onDo(t);
4     }
5 });
View Code

 

 以上就是我分析的一些细节,可能有不对的地方,先记下,以后方便复习更正。

 

posted on 2018-01-11 10:47  功夫茶茶  阅读(166)  评论(0编辑  收藏  举报

导航