事实上,callback 机制在Android 中无处不在,特别是以Handler、Callback、Listener这三个词结尾的,都是利用callback机制来实现的。比方点击事件onClickListener就是一个已经封装好的callback案例:
tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } });
对于callback的概念及意义。维基百科是这么解释:将一段代码作为參数传递,而这段代码将会在某个时刻被运行;
个人理解就是:为了代码整洁。为了方便调用并运行一些不在同一个java文件里的变量和函数;为了便于对外留出接口,便于后期加入新功能;自己也写了一个比較简单的Demo例如以下:
/** * @author Kern * @data 2015-6-12下午4:21:29 * @TODO callback 首先:定义一个interface 包括一个或者多个没有方法体的回调方法 */ public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // TextView tv = (TextView) findViewById(R.id.tv); // tv.setOnClickListener(new OnClickListener() { // // @Override // public void onClick(View v) { // // TODO Auto-generated method stub // // } // }); Utils utils = new Utils(); utils.execu(new ContrlListener() { @Override public void contrl(String str) { // TODO Auto-generated method stub Log.e("sos", str); } }); } //定义接口 public interface ContrlListener { public void contrl(String str); } }
这里:接口ContrlListener中的方法 contrl(String str);没有方法体,后期维护中,须要新增功能时,就能够直接复写control函数。方法体中调用自己新增的功能实现代码就OK了。
/** * @author Kern * @data 2015-6-12下午5:07:21 * @TODO 第二步:获取接口对象,通过对象调用方法, * */ public class Utils { ContrlListener listener; public void execu(ContrlListener listener) { this.listener = listener; new MyThread().start(); } class MyThread extends Thread { @Override public void run() { // TODO Auto-generated method stub super.run(); try { Thread.sleep(5000); for (int i = 0; i < 10; i++) { listener.contrl("电话正在接通中----" + i + 1); Thread.sleep(3000); } listener.contrl("hello,你哪位?"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }