• Android中callback(接口回调)机制


    事实上,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();
    			}
    		}
    	}
    }


    
    
  • 相关阅读:
    ubuntu下如何批量修改文件后缀名
    vanilla
    Ubuntu apt-get 彻底卸载软件包
    Kendall Rank(肯德尔等级)相关系数
    图像质量评估(IQA)
    conda常用命令
    在ubuntu中搜索文件或文件夹的方法
    libstdc++.so.6: version `GLIBCXX_3.4.21' not found
    迅雷磁力链接转BT种子工具
    springboot 集成mybatis plus3
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5076349.html
Copyright © 2020-2023  润新知