android接口回调详解、简单例子+复杂例子

原文地址:http://blog.csdn.net/u010566681/article/details/52371359

使用接口的核心原因:为了能够向上转型为多个基类型。即利用接口的多实现,可向上转型为多个接口基类型。

网上找的图片 感觉不错,通过图片可以很清晰的理解接口回调。

1.接口回调是什么?

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

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

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

  1. package test.ban.com.callback.SimpleCallBack;  
  2.   
  3. /** 
  4.  * Created by apple on 16/8/30. 
  5.  */  
  6.   
  7. public interface CallBack {  
  8.   
  9.     void doSomeThing(String string);  
  10.   
  11. }  

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

  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、具体调用类,及通过接口传递数据,回调到哪个地方

  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.  
  29.                  *  调用CallBackUtils.doCallBackMethod()即调用了CallBack.doSomeThing(info)方法; 
  30.                  *  通过接口就可以把数据传输到这个类里的doSomeThing()方法里。 
  31.                  */  
  32.                 //  
  33.                 CallBackUtils.doCallBackMethod();  
  34.             }  
  35.         }, 1000);  
  36.   
  37.   
  38.     }  
  39.   
  40.     @Override  
  41.     public void doSomeThing(String string) {  
  42.         Log.e("========""拿到CallBackUtils的传递过来的数据=====" + string);  
  43.     }  
  44. }  

复杂点的实现例子

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

  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、帮助类
  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、两种实现方式。第二种方式 即找个匿名接口实现类帮助我们()
  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. 增加一个demo 有助于进一步理解。

    主线程开启一个异步任务,当异步任务接收到数据,则把数据用TextView显示出来

    1、定义接口:
    首先 我们需要定义一个接口,定义一个方法,参数为一个字符串:
    1. package test.ban.com.callback.AsynCallBack;/** 
    2.  * Created by apple on 16/8/30. 
    3.  */  
    4.   
    5. /** 
    6.  * 作者:ban on 16/8/30 18:00 
    7.  */  
    8. public interface ChangeTitle {  
    9.     void onChangeTitle(String title);  
    10. }  
    2、定义MyTask :
    写一个异步任务,把接口作为构造方法参数,在doInBackground()方法中判断如果有数据,则接口回调
    1. package test.ban.com.callback.AsynCallBack;/** 
    2.  * Created by apple on 16/8/30. 
    3.  */  
    4.   
    5. import android.os.AsyncTask;  
    6.   
    7. /** 
    8.  * 作者:ban on 16/8/30 18:00 
    9.  */  
    10. public class MyTask extends AsyncTask<String,Void,String> {  
    11.   
    12.     private ChangeTitle changeTitle;  
    13.   
    14.     public MyTask(ChangeTitle changeTitle){  
    15.         this.changeTitle = changeTitle;  
    16.     }  
    17.   
    18.     @Override  
    19.     protected String doInBackground(String... params) {  
    20.         if (params[0]!=null) {  
    21.             changeTitle.onChangeTitle(params[0]);  
    22.         }  
    23.         return null;  
    24.     }  
    25. }  
    3、实现 接口回调:
    主Activity,给异步任务参数传this,即 接口回调方法在此类中执行,那么就需要实现ChangeTitle接口,重写接口中onChangeTitle 方法
    1. package test.ban.com.callback.AsynCallBack;/** 
    2.  * Created by apple on 16/8/30. 
    3.  */  
    4.   
    5. import android.app.Activity;  
    6. import android.os.Bundle;  
    7. import android.widget.TextView;  
    8.   
    9. import test.ban.com.callback.R;  
    10.   
    11. /** 
    12.  * 作者:ban on 16/8/30 18:02 
    13.  */  
    14. public class MyTaskActivity extends Activity implements ChangeTitle {  
    15.   
    16.     private TextView mTextView;  
    17.   
    18.     @Override  
    19.     protected void onCreate(Bundle savedInstanceState) {  
    20.         super.onCreate(savedInstanceState);  
    21.         setContentView(R.layout.activity_main);  
    22.   
    23.         mTextView = (TextView) findViewById(R.id.tv);  
    24.         new MyTask(this).execute("我是标题");  
    25.     }  
    26.   
    27.     @Override  
    28.     public void onChangeTitle(String title) {  
    29.         mTextView.setText(title);  
    30.     }  



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发中,接口回调是一种常用的设计模式。它用于实现不同组件之间的通信和交互。接口回调的基本原理是,一个类(称为回调接口)定义了一些方法,其他类可以实现这些方法并注册到回调接口中。当某个事件触发时,回调接口会调用注册的类的对应方法来处理事件。 在Android开发中,接口回调广泛应用于各种场景,比如点击事件的处理、网络请求的回调、异步任务的通知等。通过接口回调,我们可以将代码的逻辑分离,使得各个组件之间的耦合度降低,提高了代码的可维护性和扩展性。 举个例子来说,假设我们有一个按钮,当用户点击按钮时,我们希望执行一些特定的操作。这时,我们可以定义一个回调接口,比如OnClickListener,其中包含一个方法onClick。然后,我们可以在Activity中实现OnClickListener接口,并将其注册到按钮上。当用户点击按钮时,按钮会调用注册的OnClickListener的onClick方法,从而执行我们指定的操作。 因此,接口回调Android开发中非常重要的一部分,熟练掌握接口回调的使用可以提高代码的质量和开发效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [安卓开发之简单接口回调](https://blog.csdn.net/weixin_43885787/article/details/86604452)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [详解Android接口回调、方法回调](https://blog.csdn.net/qq_31881469/article/details/80089675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值