Android开发中Java回调机制的应用

  用Java写了这么久的程序,一直没有理解什么是回调,在最近的Android开发工作中,一个偶然的需求让我突然就对Java中的回调有了一个理解,遂记录之。

  首先这个需求是这样的,一个Activity中的有一个View,我需要在不同的触发条件下更换这个View的Layout,我们很容易想到写一个方法,把要更换成的Layout的id传进去,然后为这个View设置一下content。就可以在不同的条件下调用这个函数来设置View的layout了,这不难理解。

  但是,假设,现在该View的Layout更换成了LayoutA,LayoutA里面有一个ImageView,我要对该ImageView通过代码设置一些属性;然后,另一时刻,该View的Layout换成了LayoutB,LayoutB里面有一个Button,我要对该Button通过代码做一些设置,怎么办?

  我们可以这样解决:

class MyActivity extends Activity {
	View view;
	int currentContentFlag;

	private static final int ViewA = 1; // 标志着当前View显示的内容是ViewA
	private static final int ViewB = 2; // 标志着当前View显示的内容是ViewB

	/**
	* 3.最后看这个函数
	*/
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 一些例如对view初始化工作略去

		// 我们在这里设置View的layout的Id为layoutId_A
		currentContentFlag = ViewA; // 修改当前显示内容的flag,告诉这个setViewContent函数里面到底执行setViewA还是setViewB
		setViewContent(R.layout.layoutId_A);
	}

	/**
	* 1.先看本函数
	*/
	private void setViewContent(int layoutId) {
		view = LayoutInflater.from(this).inflate(layoutId, null); // 设置View的内容
		switch (currentContentFlag) {
			case ViewA:
				// 说明当前View的内容是ViewA,在这里用代码对ViewA里面的东西进行具体设置
				setViewA(view);
				break;
			case ViewB:
				// 说明当前View的内容是ViewB,在这里用代码对ViewB里面的东西进行具体设置
				setViewB(view);
				break;
			default :
				break;
		}
	}

	/**
	* 2.再看这两个函数
	*/
	private setViewA(View view) {

	}

	private setViewB(View view) {

	}
}


  这样的话,每设置一次View的内容,都要修改当前显示内容的flag,通过维护这个flag变量,来告诉这个setViewContent函数里面到底执行setViewA还是setViewB。

  这样做可不可行呢?实现肯定也可以实现,但是,我想到了用回调机制来完成这件事。

  什么是回调呢?回调回调,回去调用。我理解回调,就是,在代码执行的过程中,函数FunA()某一时刻被调用,那么将转去执行FunA(),在FunA执行的时候呢,又反过来去执行原代码里的一些东西。这应该是最浅显的解释了吧。

  在Java语言里面,我们可以通过interface实现自己的回调,Java里面的interface真的太有用了。则上面的代码可以改为下面的实现:

class MyActivity extends Activity {
	View view;

	/**
	* 3.看这个函数
	*/
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 一些例如对view初始化工作略去

		// 我们在这里设置View的layout的Id为layoutId_A
		currentContentFlag = ViewA; 
		setViewContent(R.layout.layoutId_A, new ConfigViewInterface() { // 传进去一个接口,并覆盖里面的方法
			public void setView(View view) {
				setViewA(view);
			}
		});
	}

	/**
	* 2.看本函数
	*/
	private void setViewContent(int layoutId, ConfigViewInterface configViewInterface) {
		view = LayoutInflater.from(this).inflate(layoutId, null); // 设置View的内容
		configViewInterface.setView(view);
	}

	/**
	* 4.看这两个函数
	*/
	private setViewA(View view) {

	}

	private setViewB(View view) {

	}

	/**
	* 1.看本接口
	*/
	private interface ConfigViewInterface {
		void setView(View view) ;
	}
}

  这样是不是就好多了呢?慢慢理解下上面的代码,多少会对你有帮助的。有时候学知识,就要所练,可能当时不理解某个点,不知什么时候突然就懂了。

  欢迎拍砖。


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值