接口回调

1.接口回调是什么?

接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。

接口回调的实现步骤: 简单的实现例子

1、首先定义一个接口(即回调接口)

[java]  view plain  copy
  1. package test.ban.com.callback.SimpleCallBack;  
  2.   
  3. /** 
  4.  * Created by apple on 16/8/30. 
  5.  */  
  6.   
  7. public interface CallBack {  

  8.     void doSomeThing(String string);  
  9.   
  10. }  

2、定义一个接口帮助类,接口帮助类有方法里面有个参数以是这个接口类型的(即:CallBack 

[java]  view plain  copy
  1. package test.ban.com.callback.SimpleCallBack;/** 
  2.  * Created by apple on 16/8/30. 
  3.  */  
  4.   
  5. /** 
  6.  * 作者:ban on 16/8/30 16:58 
  7.  */  
  8. public class CallBackUtils {  
  9.   
  10.     private static CallBack mCallBack;  
  11.   
  12.     public static void setCallBack(CallBack callBack) {  
  13.         mCallBack = callBack;  
  14.     }  
  15.   
  16.     public static void doCallBackMethod(){  
  17.         String info = "这里CallBackUtils即将发送的数据。";  
  18.         mCallBack.doSomeThing(info);  
  19.     }  
  20.   
  21. }  
3、具体调用类,及通过接口传递数据,回调到哪个地方

[java]  view plain  copy
  1. package test.ban.com.callback.SimpleCallBack;/** 
  2.  * Created by apple on 16/8/30. 
  3.  */  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.util.Log;  
  9.   
  10. /** 
  11.  * 作者:ban on 16/8/30 16:58 
  12.  */  
  13. public class SimpleCallBackTest extends Activity implements CallBack {  
  14.   
  15.     @Override  
  16.     protected void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.   
  19.         CallBackUtils.setCallBack(this);  
  20.   
  21.         //1s后调用CallBackUtils的doCallBackMethod()方法。  
  22.         new Handler().postDelayed(new Runnable() {  
  23.             @Override  
  24.             public void run() {  
  25.                 /** 
  26.                  *  调用doCallBackMethod方法,目的是将SimpleCallBackTest注册到接口那里, 
  27.                  *  使接口知道,需要调用的是哪个类中的,实现该接口的方法。 
  28.                  *  调用CallBackUtils.doCallBackMethod()即调用了CallBack.doSomeThing(info)方法; 
  29.                  *  通过接口就可以把数据传输到这个类里的doSomeThing()方法里。 
  30.                  */  
  31.                 //  
  32.                 CallBackUtils.doCallBackMethod();  
  33.             }  
  34.         }, 1000);  
  35.     }  
  36.   
  37.     @Override  
  38.     public void doSomeThing(String string) {  
  39.         Log.e("========""拿到CallBackUtils的传递过来的数据=====" + string);  
  40.     }  
  41. }  

个人总结:1,先定义一个接口interface A,里面有方法m();

                 2,在新建一个类 class B;在B中实例化一个A a; 创建一个方法b1()将a作为参数;再创建一个方法b2调用a.m();

                 3 ,  再创建一个类 class C实现接口A,调用B里面的方法b1(this);再实现b2;




复杂点的实现例子

1、首先也是定义一个接口(即回调接口)

[java]  view plain  copy
  1. <pre name="code" class="java">package test.ban.com.callback;/** 
  2.  * Created by apple on 16/8/30. 
  3.  */  
  4.   
  5. import android.graphics.Bitmap;  
  6.   
  7. /** 
  8.  * 作者:ban on 16/8/30 16:10 
  9.  */  
  10. public interface ImageStateInterface {  
  11.   
  12.     void onImageStart();  
  13.   
  14.     void onImageSuccess(Bitmap bitmap);  
  15.   
  16.     void onImageFailed();  
  17.   
  18.     void OnEnd();  
  19. }  


 2、帮助类 
  
[java]  view plain  copy
  1. package test.ban.com.callback;/** 
  2.  * Created by apple on 16/8/30. 
  3.  */  
  4.   
  5. import android.content.Context;  
  6. import android.graphics.Bitmap;  
  7. import android.graphics.BitmapFactory;  
  8.   
  9. /** 
  10.  * 作者:ban on 16/8/30 16:11 
  11.  */  
  12. public class DownloadImageUtil {  
  13.   
  14.     public static void StartDownLoad(final ImageStateInterface imageStateInterface,  
  15.                                      final Context context) {  
  16.         //该imageStateInterface使其得知,是从哪里注册过来的,然后根据其来源调用其实现的接口方法。  
  17.   
  18.         //如下,此时调用的就是MainActivity.this中实现的onImageStart方法。  
  19.         imageStateInterface.onImageStart();  
  20.   
  21.         new Thread(new Runnable() {  
  22.   
  23.             @Override  
  24.             public void run() {  
  25.                 try {  
  26.                     new Thread().sleep(5000);  
  27.                 } catch (InterruptedException e) {  
  28.                     e.printStackTrace();  
  29.                 }  
  30.                 Bitmap bitmap = BitmapFactory.decodeResource(  
  31.                         context.getResources(), R.mipmap.ic_launcher);  
  32.                 imageStateInterface.onImageSuccess(bitmap);  
  33.             }  
  34.         }).start();  
  35.         imageStateInterface.OnEnd();  
  36.     }  
  37. }  

3、两种实现方式。第二种方式 即找个匿名接口实现类帮助我们()
[java]  view plain  copy
  1. package test.ban.com.callback;/** 
  2.  * Created by apple on 16/8/30. 
  3.  */  
  4.   
  5. import android.annotation.SuppressLint;  
  6. import android.app.Activity;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.drawable.BitmapDrawable;  
  9. import android.os.Bundle;  
  10. import android.util.Log;  
  11. import android.view.View;  
  12. import android.widget.Button;  
  13. import android.widget.TextView;  
  14. import android.widget.Toast;  
  15.   
  16. /** 
  17.  * 作者:ban on 16/8/30 16:10 
  18.  */  
  19. public class MainActivity extends Activity implements ImageStateInterface {  
  20.     private Button button;  
  21.     private TextView mTextView;  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.activity_main);  
  27.   
  28.         /** 
  29.          * 实例化控件 
  30.          */  
  31.         //实现方式一 (推荐)  
  32.         onLincoln();  
  33.         //实现方式二  
  34.         //onLincolnTwo();  
  35.   
  36.     }  
  37.   
  38.     /** 
  39.      * 实现方式一  这个需要  implements ImageStateInterface 接口 
  40.      */  
  41.     private void onLincoln() {  
  42.         button = (Button) findViewById(R.id.button);  
  43.         mTextView = (TextView) findViewById(R.id.tv);  
  44.         button.setOnClickListener(new View.OnClickListener() {  
  45.   
  46.             @Override  
  47.             public void onClick(View v) {  
  48.   
  49.                 DownloadImageUtil downloadImageUtil = new DownloadImageUtil();  
  50.                 /** 
  51.                  调用StartDownLoad方法,目的是将MainActivity注册到接口那里, 
  52.                  使接口知道,需要调用的是哪个类中的实现该接口的方法。 
  53.                  */  
  54.                 downloadImageUtil.StartDownLoad(MainActivity.this,  
  55.                         getApplicationContext());  
  56.             }  
  57.         });  
  58.   
  59.     }  
  60.   
  61.     @Override  
  62.     public void onImageStart() {  
  63.         Log.d("lincoln""onImageStart");  
  64.         button.setText("onImageStart");  
  65.         mTextView.setText("onImageStart");  
  66.   
  67.     }  
  68.   
  69.     @Override  
  70.     public void onImageSuccess(final Bitmap bitmap) {  
  71.         Log.d("lincoln""onImageSuccess");  
  72.         runOnUiThread(new Runnable() {  
  73.   
  74.             @SuppressLint("NewApi")  
  75.             @Override  
  76.             public void run() {  
  77.                 button.setText("onImageSuccess");  
  78.                 mTextView.setText("onImageSuccess");  
  79.                 button.setBackground(new BitmapDrawable(bitmap));  
  80.             }  
  81.         });  
  82.     }  
  83.   
  84.     @Override  
  85.     public void onImageFailed() {  
  86.   
  87.     }  
  88.   
  89.     @Override  
  90.     public void OnEnd() {  
  91.         Toast.makeText(MainActivity.this"完成啦!!", Toast.LENGTH_SHORT).show();  
  92.     }  
  93.     /**---------------------实现方式一 结束------------------------*/  
  94.   
  95.   
  96.     /** 
  97.      * --------------------------实现方式二----------------------------- 
  98.      */  
  99.   
  100.     private void onLincolnTwo() {  
  101.         button = (Button) findViewById(R.id.button);  
  102.         button.setOnClickListener(new View.OnClickListener() {  
  103.   
  104.             @Override  
  105.             public void onClick(View v) {  
  106.   
  107.                 DownloadImageUtil.StartDownLoad(imageInterface,  
  108.                         MainActivity.this);  
  109.             }  
  110.         });  
  111.   
  112.     }  
  113.   
  114.     ImageStateInterface imageInterface = new ImageStateInterface() {  
  115.   
  116.         @Override  
  117.         public void onImageStart() {  
  118.             Log.d("lincoln""onImageStart");  
  119.             button.setText("onImageStart");  
  120.         }  
  121.   
  122.         @Override  
  123.         public void onImageSuccess(final Bitmap bitmap) {  
  124.             Log.d("lincoln""onImageSuccess");  
  125.             runOnUiThread(new Runnable() {  
  126.   
  127.                 @SuppressLint("NewApi")  
  128.                 @Override  
  129.                 public void run() {  
  130.                     button.setText("onImageSuccess");  
  131.   
  132.                     button.setBackground(new BitmapDrawable(bitmap));  
  133.                 }  
  134.             });  
  135.         }  
  136.   
  137.         @Override  
  138.         public void onImageFailed() {  
  139.   
  140.         }  
  141.   
  142.         @Override  
  143.         public void OnEnd() {  
  144.             Toast.makeText(MainActivity.this"哈哈!!", Toast.LENGTH_SHORT).show();  
  145.         }  
  146.     };  
  147.     /**-----------------------------------------------------------------------------*/  
  148.   
  149. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值