我有一个活动可能会在用户按下并完成()活动时运行线程。那时候那些线程会发生什么?除非我在onDestroy()中断它们,否则它们都会尝试完成吗?
例如,下面的代码是不安全的,因为如果活动在线程之前完成,我的视图和游标可能会被销毁?
我问的原因是,在完成尚未成功调试的活动时偶尔会发生崩溃,因为它们很少发生,而且从未处于调试模式。我已经开始检查我的视图对象是否为null,然后在runOnUIThread()中对它们执行任何操作。不确定这是否是最干净的解决方案,或者根本不是问题。
new Thread()(
public void run(){
crunchOnSomethingForAwhile(mCursor);
MyActivity.this.runOnUIThread(new Runnable(){
public void run(){
mTextView.setText("thread complete");
mCursor.close();
}
}
}
).start();
答案 0 :(得分:1)
我会考虑使用AsyncTask而不是简单的Thread
。它有一些内置的支持,可以在另一个线程中完成工作,然后在UI线程上完成一些操作。
也就是说,有很多线索讨论如何在活动结束时处理AsyncTask
。你究竟应该做什么取决于任务的作用。如果它仅适用于该Activity,那么您可以在onPause中取消该任务(假设它不仅仅是轮换更改)。
否则,有各种策略可以保持跨活动的AsyncTasks。有关一些想法,请参阅此question。这个commonsware blog还有一个在屏幕旋转中保持AsyncTask的示例。
答案 1 :(得分:1)
有人在另一个线程上发布了一个答案,即onDestroy将所有视图引用设置为null,最后将活动引用设置为null。所以我假设最好在onDestroy中中断所有正在运行的线程,或者至少在任何runInUIThread方法中捕获NullPointerExceptions。