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

上一篇 / 下一篇  2012-09-05 09:49:29 / 个人分类:Java

51Testing软件测试网)Z'Ow-G@A

  用Java写了这么久的程序,一直没有理解什么是回调,在最近的Android开发工作中,一个偶然的需求让我突然就对Java中的回调有了一个理解,遂记录之。51Testing软件测试网a%T T ]l`B2P*V} Z

51Testing软件测试网#F5i;^p;o,w Pa0?^

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

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

tEI6G!KYW\D~8ym051Testing软件测试网BNuz1c2k.Y

  我们可以这样解决:51Testing软件测试网9V(V@1h'O#|

~_!ym ^0class MyActivity extends Activity {
,WC*z SXti"b0 View view;51Testing软件测试网#}5q1{!z\ F&y
 int currentContentFlag;
51Testing软件测试网|1P^}{Dc

CpI,|3r"Dq,W)xc0 private static final int ViewA = 1; // 标志着当前View显示的内容是ViewA
5PDen3ESu`:S0 private static final int ViewB = 2; // 标志着当前View显示的内容是ViewB

VY(H/p(A6] |Z:H0

/lGX$l$LPL|0 /**51Testing软件测试网9a.{p9~5T
 * 3.最后看这个函数
]~]Cwy0 */51Testing软件测试网~u8eG+m4G!W,u
 @Override51Testing软件测试网o!WB.ssMu3Q
 public void onCreate(Bundle savedInstanceState) {51Testing软件测试网*cy[6\ UPQ
  super.onCreate(savedInstanceState);
E/[UV,Kx0  setContentView(R.layout.activity_main);

|0J%a(L9i+g051Testing软件测试网&u,G3|k3Z}

  // 一些例如对view初始化工作略去51Testing软件测试网 ~6RBAf+H

'V)[Y)r'Y"y0  // 我们在这里设置View的layout的Id为layoutId_A51Testing软件测试网 Lch"g:jc.n5P}
  currentContentFlag = ViewA; // 修改当前显示内容的flag,告诉这个setViewContent函数里面到底执行setViewA还是setViewB51Testing软件测试网t\5H[#YAh
  setViewContent(R.layout.layoutId_A);
flCL:^0 }
51Testing软件测试网{J*B V.nOR

51Testing软件测试网 v^,e'WW(] G

 /**51Testing软件测试网%w(X cJ2E,s D
 * 1.先看本函数
Y*@7h9B&_wY)]~0 */
v.Hxas0 private void setViewContent(int layoutId) {
N0\"}C N*A8K#w)h0  view = LayoutInflater.from(this).inflate(layoutId, null); // 设置View的内容51Testing软件测试网xd8u9?oYI G
  switch (currentContentFlag) {51Testing软件测试网:d zd J ET.F4q Z0e
   case ViewA:
L#t$TcHE/@0    // 说明当前View的内容是ViewA,在这里用代码对ViewA里面的东西进行具体设置51Testing软件测试网/A OpP*f-@,g9I
    setViewA(view);
,V0eb9?Z!L0    break;51Testing软件测试网 nmn ^9\,o!`GU
   case ViewB:51Testing软件测试网8~,ZNA$x.p
    // 说明当前View的内容是ViewB,在这里用代码对ViewB里面的东西进行具体设置51Testing软件测试网R0nR)B6F
    setViewB(view);51Testing软件测试网l0R+h j7\h6n
    break;
9n#]VG2i#r0   default :51Testing软件测试网(t _H mpD*~
    break;
q/~F ai"I {z0  }
2?v V\bzm/Ds0 }

*\Ap*A7{!z ?051Testing软件测试网8K C]6nn?[V {qU

 /**
x2m.R-x&`0 * 2.再看这两个函数
O&pr'TOcU8S y0w7?.L-O E0 */51Testing软件测试网 Kza7N5F8o!R6s5g.dy4AX
 private setViewA(View view) {

&[6q4RnPiw(T"b0

sK O&hZW)~0 }

$_R(b#b(BI)]'N;t0

#ikTepJ0 private setViewB(View view) {

1L$v V&I"r3VaFX.TWe0

4qG;w+e]?I5pl7P2to0 }51Testing软件测试网v-},I9l S+w0{:F
}

3r5SmcPt9m@-E0

/t?_X4fG``0  这样的话,每设置一次View的内容,都要修改当前显示内容的flag,通过维护这个flag变量,来告诉这个setViewContent函数里面到底执行setViewA还是setViewB。51Testing软件测试网;V,~ W@T @!E

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

T:w7Q+g3udh3gj;M051Testing软件测试网 ]`8{+d0M

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

,V+o XT:E#y;C l"`0  在Java语言里面,我们可以通过interface实现自己的回调,Java里面的interface真的太有用了。则上面的代码可以改为下面的实现:51Testing软件测试网6n|{U#vBb J0g

muz+z yq1bDsr Y0

e&ifr(@,a-Y%R"a0
51Testing软件测试网#` wiK1e,xl([]BEs

class MyActivity extends Activity {
4h3w"@A5[M0 View view;

V~6IZ?{ b0o$u2w051Testing软件测试网|bN'kx/_aW

 /**
HJy5t.Q^y0 * 3.看这个函数51Testing软件测试网 i&ie[Y.rn
 */51Testing软件测试网/`M Q3E~2lSa-A+C
 @Override
z"@xLuq0 public void onCreate(Bundle savedInstanceState) {
H R"C[/{S;m^?0  super.onCreate(savedInstanceState);51Testing软件测试网v2T&Q7HfX0j `S i
  setContentView(R.layout.activity_main);

{3c d;d6K$v6S9j051Testing软件测试网G0F,qw Uw9B

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

C`H/z/DPp*~#|`cK0

c1KAR@2x'w0  // 我们在这里设置View的layout的Id为layoutId_A
a)r9`\ygj0  currentContentFlag = ViewA;51Testing软件测试网 jc(b L,p&v:rhD
  setViewContent(R.layout.layoutId_A, new ConfigViewInterface() { // 传进去一个接口,并覆盖里面的方法
2n.DMl F0   public void setView(View view) {51Testing软件测试网h1D)P!H:f4a&p/dT
    setViewA(view);51Testing软件测试网(Rr NLH O
   }51Testing软件测试网J O |B1KAZf
  });
!U+Z4l Yc}0 }
51Testing软件测试网-N1s:K;th _3tN'J-L2A

51Testing软件测试网.X'h5c7s(y3E:Q e

 /**51Testing软件测试网{^y&D3p+b&n4E
 * 2.看本函数51Testing软件测试网'qh cd"r%F
 */
,d9d)n D6}5G0 private void setViewContent(int layoutId, ConfigViewInterface configViewInterface) {
V w-i#}3}"v K,y0  view = LayoutInflater.from(this).inflate(layoutId, null); // 设置View的内容
#Eyn2Xq.u0  configViewInterface.setView(view);
/a mEO2UJ@j2~~ `0 }

(r QuIL0

Zj {%Yw k _@0 /**51Testing软件测试网OS j:[@z
 * 4.看这两个函数
b6}h?.T;I"e9Fa J0 */
L v5Z/I*G]#W0 private setViewA(View view) {
51Testing软件测试网(f^-f Wy

51Testing软件测试网ypfa_ X(ii

 }51Testing软件测试网z!_$d-W:u1?3R

51Testing软件测试网d&lySps2S'c

 private setViewB(View view) {51Testing软件测试网y]JZ!Z!v"v CM

51Testing软件测试网*W8Va)} QD#H

 }

m(RK;mVn0

Md-o-r!sC"}0 /**51Testing软件测试网'}2mx _z6aGjc3_B%N7o
 * 1.看本接口51Testing软件测试网_2KY9?o
 */
/j{Guw7X0 private interface ConfigViewInterface {
"cf;vT+B#A?0  void setView(View view) ;
&_R6Yf-GEQ3fZY(uL0 }51Testing软件测试网'YTa+Lvc3ux
}

nLP/^+CJhf#D0
51Testing软件测试网oICw"uW'x9D

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

,j5ih$R ?X/LZWG L051Testing软件测试网3o G.|,Vc Nlw

  欢迎拍砖。

P LP Y!L0

TAG:

 

评分:0

我来说两句

Open Toolbar