zoukankan      html  css  js  c++  java
  • 关于接口回调的分析

    最近在看《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
     以上就是我分析的一些细节,可能有不对的地方,先记下,以后方便复习更正。
  • 相关阅读:
    opengl编程指南
    Binder机制1---Binder原理介绍
    [Android]使用platform密钥来给apk文件签名的命令
    IntentFilter
    最高分是多少
    Spring注入
    Bean容器的初始化
    Spring中的Junit
    IOC
    接口及面向接口编程
  • 原文地址:https://www.cnblogs.com/wanjiang/p/8267317.html
Copyright © 2011-2022 走看看