接口回调机制

本文详细解释了接口回调的概念及其在Android开发中的应用实例。通过具体的代码示例,展示了如何定义和使用回调接口,以及如何实现线程间的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两天跟之前的一个学生聊天的时候,他说到,我这有几个小弟,工作一年了,接口回调都不会用,那么我们今天呢就给大家讲讲接口的回调吧。

接口回调:

百度百科上说是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。


那我们用自己的话来说,接口回调可以简单理解为:使用某一接口的实现类创建对象的引用赋值给该接口声明的接口变量,也就是多态的体现方式,那么这个接口变量就可以调用被类实现的接口的方法;通常开发过程中,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。


那么在Android中的接口回调可以说是随处可见,举个最基本的例子如button的点击事件onClick()。我们知道onClick()是一个回调方法,那么它内部是怎么实现的呢,我们可以研究一下它的实现:

 

首先,在接口中定义一个onClick()方法


    public interface OnClickListener { 

        void onClick(View v);  

   }  


使用时首先用activity实现OnClickListerner,其次在onCreate()中注册,最后在onCLick()方法中进行事件处理

     public class MainActivity extends Activity implements OnClickListener{  

          private Button button;  

          @Override  

          public void onCreate(Bundle savedInstanceState) {  

               super.onCreate(savedInstanceState);  

               setContentView(R.layout.activity_main);  

               button = (Button)findViewById(R.id.button1);  

               button.setOnClickListener(this);  

          }  

       

          @Override  

          public void onClick(View v) {  

               Toast.makeText(getApplication(), 

                    "OnClick", Toast.LENGTH_LONG).show();  

          }  

       

     } 


接下来我们看一下在View里同意处理的回调,剔除掉注释后代码如下

public class View implements Drawable.Callback,

             KeyEvent.Callback, AccessibilityEventSource {  

    protected OnClickListener mOnClickListener;  

  

     public void setOnClickListener(OnClickListener l) {  

        if (!isClickable()) {  

            setClickable(true);  

        }  

        mOnClickListener = l;  

    }  

     

    public boolean performClick() {  

        sendAccessibilityEvent(AccessibilityEvent.

                                    TYPE_VIEW_CLICKED);  

  

        if (mOnClickListener != null) {  

            playSoundEffect(SoundEffectConstants.CLICK);  

             

            mOnClickListener.onClick(this);  

            return true;  

        }  

  

        return false;  

    }  

}  


如上,最终是调用mOnClickListener.onClick(this)也就是OnClickListener 的onClick()方法实现方法回调,那么真正在开发中的应用呢简单



下面我们简单的来一个回调实现:

1、首先我们定义一个监听接口

public interface YourListener {

    public void onSomeChange(String info, int i);

}

2、我们定义一个独立工作的线程类

public class ThreadSubclass extends Thread {

    private YourListener mYourListener = null;

    @Override

    public void run() {

        int count = 0;

        String result = null;

        for (int i = 0; i < 5; i++) {

            Log.i("msg", "Now is " + i);

            count += i;

            result += i;

        }

        if (mYourListener != null) {

            mYourListener.onSomeChange(result, count);

        }

    }

    // 设置回调接口(监听器)的方法

    public void setYourListener(YourListener yourListener) {

        mYourListener = yourListener;

    }

}

如上,定义一个线程来完成工作,这里你可以开启线程进行网络数据请求。此处我就使用循环来模拟操作,然后在循环里给两个变量赋值,如果检测到listener不为空的话,便将得到的值进行通知

最后是在 MAinActivity里调用了,代码如下

public class MainActivity extends Activity {

    private ThreadSubclass mThreadSubclass;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        init();

    }

    private void init(){

        mThreadSubclass=new ThreadSubclass();

        mThreadSubclass.setYourListener(new YourListener() {

            @Override

            public void onSomeChange(String info,int i) {

                Log.i("msg", "------> info="+info);

                Log.i("msg", "------> i="+i);

            }

        });

        mThreadSubclass.start();

    }

}

此处我们调用的时候,直接调用mThreadSubclass.setYourListener()方法使用匿名内部类就可以得到回调处理返回的值啦。运行效果如下:


这里回调就写完啦,大家有没有对接口回调产生概念呢,不熟的话可以回头吧这个例子自己练习练习吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值