zoukankan      html  css  js  c++  java
  • 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();
    			}
    		}
    	}
    }


    
    
  • 相关阅读:
    Solution: Win 10 和 Ubuntu 16.04 LTS双系统, Win 10 不能从grub启动
    在Ubuntu上如何往fcitx里添加输入法
    LaTeX 笔记---Q&A
    Hong Kong Regional Online Preliminary 2016 C. Classrooms
    Codeforces 711E ZS and The Birthday Paradox
    poj 2342 anniversary party
    poj 1088 滑雪
    poj 2479 maximum sum
    poj 2481 cows
    poj 2352 stars
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5076349.html
Copyright © 2011-2022 走看看