public void askJumpToInterac(final String intercMode) {
if (mAskJumInteracDialog == null) {
mAskJumInteracDialog = new ComfirmDialog(this, "设备正在互动,是否进入?");
mAskJumInteracDialog.setCallback(new ComfirmDialog.DialogInterface() {
@Override
public void onSure(Dialog dialog) {
if (Constant.INTERAC_MODE_TEACH.equals(intercMode)) {
InteracNavigationUtil.navigateToInterac(MainActivity.this);
} else if (Constant.INTERAC_MODE_LISTEN.equals(intercMode)) {
InteracNavigationUtil.navigateToListen(MainActivity.this);
}
dialog.dismiss();
}
@Override
public void onCancel(Dialog dialog) {
dialog.dismiss();
}
});
}
if (!mAskJumInteracDialog.isShowing()) {
if (goInteracDirectly) {
if (Constant.INTERAC_MODE_TEACH.equals(intercMode)) {
InteracNavigationUtil.navigateToInterac(MainActivity.this);
} else if (Constant.INTERAC_MODE_LISTEN.equals(intercMode)) {
InteracNavigationUtil.navigateToListen(MainActivity.this);
}
} else {
mAskJumInteracDialog.show();
}
}
goInteracDirectly = false;
}
public void askJumpToInterac(final String intercMode) {
if (mAskJumInteracDialog == null) {
mAskJumInteracDialog = new ComfirmDialog(this, "设备正在互动,是否进入?");
}
mAskJumInteracDialog.setCallback(new ComfirmDialog.DialogInterface() {
@Override
public void onSure(Dialog dialog) {
if (Constant.INTERAC_MODE_TEACH.equals(intercMode)) {
InteracNavigationUtil.navigateToInterac(MainActivity.this);
} else if (Constant.INTERAC_MODE_LISTEN.equals(intercMode)) {
InteracNavigationUtil.navigateToListen(MainActivity.this);
}
dialog.dismiss();
}
@Override
public void onCancel(Dialog dialog) {
dialog.dismiss();
}
});
if (!mAskJumInteracDialog.isShowing()) {
if (goInteracDirectly) {
if (Constant.INTERAC_MODE_TEACH.equals(intercMode)) {
InteracNavigationUtil.navigateToInterac(MainActivity.this);
} else if (Constant.INTERAC_MODE_LISTEN.equals(intercMode)) {
InteracNavigationUtil.navigateToListen(MainActivity.this);
}
} else {
mAskJumInteracDialog.show();
}
}
goInteracDirectly = false;
}
上述代码不细看好像没什么问题,但是运行后会发现第一段代码的Callback设置在Dialog实例为空的情况下,也就是说Callback的设置只执行一次,导致的结果是每次回调interacMode都是相同的值。对于匿名内部类来说,匿名内部类实例化会时,底层通过其构造器将外部final变量作为匿名内部类的成员变量传入,此时此引用变量不可变。因此,第一段代码匿名内部类的回调函数调用的都是相同的值,而第二段由于每次传入新值都会重新实例化Callback,因此其值是实时传入的intercMode值。
博客指出一段代码中Callback设置在Dialog实例为空时只执行一次,导致每次回调interacMode值相同。解释了匿名内部类实例化时,底层将外部final变量作为成员变量传入,引用不可变。而另一段代码每次传入新值会重新实例化Callback,值为实时传入的intercMode值。
171万+

被折叠的 条评论
为什么被折叠?



