在我的应用程序的最新版本中,有些用户遇到了我无法重现的崩溃。目前只有Samsung
设备运行Lollipop
有问题,但这可能只是巧合。 分析堆栈跟踪和相关代码后,我认为我可能找到了罪魁祸首。为了测试我的假设,我简化了代码,下面的代码片段:在onDestroy之后是否可以调用回调方法?
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button b = new Button(this);
b.setText("Click me!");
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Handler().post(new Runnable() {
@Override
public void run() {
// This is the callback method
Log.d("TAG", "listenerNotified");
}
});
}
});
setContentView(b);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("TAG", "onDestroy");
}
}
每次我先点击该测试上面的应用点击我按钮,然后单击后退按钮,listenerNotified
被打印到控制台前onDestroy()
。
但我不确定是否可以依靠这种行为。 Android
对上述情况做出任何保证?我可以安全地假设我的Runnable
将始终在onDestroy()
之前执行,或者在某种情况下不会出现这种情况?在我的真实应用程序中,当然会有更多的事情发生(像其他线程发布到主线程以及更多操作发生在回调中)。但是这个简单的片段似乎足以证明我的担忧。
是否有可能(可能是由于其他线程或回调发布到主线程的影响),我得到下面的调试输出?
D/TAG: onDestroy
D/TAG: listenerNotified
我想知道这一点,因为可能的结果会解释崩溃。
你为什么要通过处理程序发布runnable?同时,你可以看看http://stackoverflow.com/questions/31432014/onclicklistener-fired-after-onpause –
当你有像这样的异步回调时,你应该总是检查回调,如果'活动'仍然活着处理回调。最简单的方法是调用'isFinishing()',如果'Activity'不再是“活动”,则返回'true'。 –