_XP f%R4L0用Java写了这么久的程序,一直没有理解什么是回调,在最近的开发中,一个偶然的需求让我突然就对Java中的回调有了一个理解,遂记录之。&fi'wSI@.B[RtNI051Testing软件测试网z4_8F)^srE^
首先这个需求是这样的,一个Activity中的有一个View,我需要在不同的触发条件下更换这个View的Layout,我们很容易想到写一个方
法,把要更换成的Layout的id传进去,然后为这个View设置一下content。就可以在不同的条件下调用这个函数来设置View的layout
了,这不难理解。'^x%Fy.r1@Ub051Testing软件测试网Fm| ]z5Cp
但是,假设,现在该View的Layout更换成了LayoutA,LayoutA里面有一个ImageView,我
要对该ImageView通过代码设置一些属性;然后,另一时刻,该View的Layout换成了LayoutB,LayoutB里面有一个
Button,我要对该Button通过代码做一些设置,怎么办?51Testing软件测试网|[8o@F;nL,k*m51Testing软件测试网:k$i9| YS$T
我们可以这样解决:51Testing软件测试网%U8P/U^Q{U'Vv n
s:vpPo0class MyActivity extends Activity {
O_'cC&r8h.uE0 View view;51Testing软件测试网i,b.Al}z `9^o[o
int currentContentFlag;51Testing软件测试网8KWt%r&P'^mAi
3~$ZX&dB2S0private static final int ViewA = 1; // 标志着当前View显示的内容是ViewA51Testing软件测试网'\2XM:Bt8v
private static final int ViewB = 2; // 标志着当前View显示的内容是ViewB51Testing软件测试网.q0i:Is P-sh
i1Z1K2Jc_2zy0/**
\C%VE#N?x0 * 3.最后看这个函数
&fK8V Hqp
je%p0 */51Testing软件测试网O
hU+m)v]~0u
@Override51Testing软件测试网5Y%W#D^:N2Zi
public void onCreate(Bundle savedInstanceState) {51Testing软件测试网:};f/?(m6K~!~
super.onCreate(savedInstanceState);51Testing软件测试网'j#sMDN}z`m
setContentView(R.layout.activity_main);51Testing软件测试网@1GYz3o'\S51Testing软件测试网4Q$a?;uX.SE,h*Y
// 一些例如对view初始化工作略去51Testing软件测试网:QR }w+|er/vW:id4L51Testing软件测试网X%?#I-Yh
// 我们在这里设置View的layout的Id为layoutId_A
mN+F8j[t0 currentContentFlag = ViewA; // 修改当前显示内容的flag,告诉这个setViewContent函数里面到底执行setViewA还是setViewB51Testing软件测试网u0Eb9?:H'O8t
setViewContent(R.layout.layoutId_A);
R"Wn-h nC:oS:B0 }51Testing软件测试网c#a[O&fw3Cy51Testing软件测试网S+\%sa/P3Wl
/**
/a+`2L7bw"ak~ Q0 * 1.先看本函数51Testing软件测试网K*};k%Lq Dg
*/51Testing软件测试网]1v)]p.@#h
private void setViewContent(int layoutId) {
'X,MafB5m0 view = LayoutInflater.from(this).inflate(layoutId, null); // 设置View的内容
\'d+T+UgdH2Z*D0 switch (currentContentFlag) {51Testing软件测试网yA O['])v#p
case ViewA:51Testing软件测试网 `i{/b?S;[;ET
// 说明当前View的内容是ViewA,在这里用代码对ViewA里面的东西进行具体设置
,x#V)TWk0 setViewA(view);
$\mG1Qi.b3y)G)D0 break;
/?(}UexA1W$h5Ii)q0 case ViewB:
_phV1X6A4i0 // 说明当前View的内容是ViewB,在这里用代码对ViewB里面的东西进行具体设置51Testing软件测试网~`'@.N9a'z&K
setViewB(view);
P:?1n5p+Cu+Vc2E([k0 break;
6bs[9^;A+x b0 default :51Testing软件测试网j8k)D'tFljX
break;51Testing软件测试网m2v]5E A
}
+Z5\bd]r5@7`0 }%v\lA/m"Ob/[1G051Testing软件测试网P NS!C4r
/**
`M)z;l(X
tO0 * 2.再看这两个函数
5S:Hc'\0Ul1j+d V"R0 */
@'L!p$wp!K7n0 private setViewA(View view) {51Testing软件测试网r~RX-n.c
(X4qyXY0}@2]%]{0`0x+b051Testing软件测试网F5klo#VV/L6D
private setViewB(View view) {51Testing软件测试网1cxCU*P mLa51Testing软件测试网8Y3eyQry
}51Testing软件测试网:L?\@)C
}7XES]YB8eN"kig051Testing软件测试网"ZkS7HVUW]7S|&B
这样的话,每设置一次View的内容,都要修改当前显示内容的flag,通过维护这个flag变量,来告诉这个setViewContent函数里面到底执行setViewA还是setViewB。51Testing软件测试网(r2lIR;x
%R-AYV|t&o*d;K0这样做可不可行呢?实现肯定也可以实现,但是,我想到了用回调机制来完成这件事。5|t&D"|6WYa/vf051Testing软件测试网6o+[D6R~Va#p
什么是回调呢?回调回调,回去调用。我理解回调,就是,在代码执行的过程中,函数FunA()某一时刻被调用,那么将转去执行FunA(),在FunA执行的时候呢,又反过来去执行原代码里的一些东西。这应该是最浅显的解释了吧。