前两天跟之前的一个学生聊天的时候,他说到,我这有几个小弟,工作一年了,接口回调都不会用,那么我们今天呢就给大家讲讲接口的回调吧。
接口回调:
百度百科上说是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
那我们用自己的话来说,接口回调可以简单理解为:使用某一接口的实现类创建对象的引用赋值给该接口声明的接口变量,也就是多态的体现方式,那么这个接口变量就可以调用被类实现的接口的方法;通常开发过程中,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。
那么在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()方法使用匿名内部类就可以得到回调处理返回的值啦。运行效果如下:
这里回调就写完啦,大家有没有对接口回调产生概念呢,不熟的话可以回头吧这个例子自己练习练习吧