【发布时间】:2017-01-26 12:54:29
【问题描述】:
在我的应用程序的最新版本中,一些用户遇到了我无法重现的崩溃。目前只有运行Lollipop 的Samsung 设备存在问题,但这可能只是巧合。
在分析了堆栈跟踪和相关代码之后,我认为我可能已经找到了罪魁祸首。为了测试我的假设,我将代码简化为下面的 sn-p:
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() 之前执行,或者是否有一种情况并非如此?在我的真实应用程序中,当然会发生更多事情(例如其他线程发布到主线程以及回调中发生的更多操作)。但这个简单的 sn-p 似乎足以表明我的担忧。
是否有可能(可能由于其他线程或发布到主线程的回调的影响)我得到下面的调试输出?
D/TAG: onDestroy
D/TAG: listenerNotified
我想知道这一点,因为可能的结果可以解释崩溃。
【问题讨论】:
-
为什么要通过处理程序发布可运行文件?同时你可以看看stackoverflow.com/questions/31432014/…
-
当你有这样的异步回调时,如果
Activity仍然存在,你应该在处理回调之前检查回调。最简单的方法是调用isFinishing(),如果Activity不再“活动”,则返回true。
标签: java android multithreading android-activity android-lifecycle