2011-02-10 68 views
6

我有一个活动,当用户按下并完成()该活动时可能有线程正在运行。那时候那些线程会发生什么?他们都会尝试完成,除非我在onDestroy()中打断它们?活动的线程和视图在被销毁时会发生什么?

例如,下面的代码是不安全的,因为如果活动在线程之前完成,我的视图和游标可能会被销毁?

我问的原因是,在完成尚未成功调试的活动时,我偶尔会发生崩溃,因为它们在调试模式下很少发生,永远不会发生。我从此开始检查我的视图对象是否在执行runOnUIThread()中的任何操作之前为空。不知道这是否是最干净的解决方案,或者如果这是问题。

new Thread()(
public void run(){ 
    crunchOnSomethingForAwhile(mCursor); 
    MyActivity.this.runOnUIThread(new Runnable(){ 
     public void run(){ 
      mTextView.setText("thread complete"); 
      mCursor.close(); 
     } 
    } 
} 
).start(); 
+0

当这些崩溃发生时,LogCat会说什么? – alexanderblom 2011-02-10 17:36:58

+0

他们只在我离开我的电脑时才发生,所以我没有连接到LogCat。也许我错过了一些非常基本的东西,但是当我尝试在Windows控制台中稍后转储我的日志时,我只能在控制台窗口中看到最后几页值得记录的日志 - 我想它已经没有空间了。需要弄清楚如何将文件作为文件转储到我的电脑。 – Tenfour04 2011-02-11 17:34:10

回答

1

有人在另一个线程上发布了一个答案,onDestroy将所有视图引用设置为null,最后将活动引用为null。所以我认为最好的做法是中断onDestroy中的所有正在运行的线程,或者至少捕获任何runInUIThread方法中的NullPointerExceptions。

1

我会看看使用AsyncTask,而不是一个简单的Thread。它有一些支持在另一个线程中工作,然后在UI线程上完成某些工作。

也就是说,有很多讨论如何在活动结束时处理AsyncTask的问题。你应该做什么取决于任务在做什么。如果它仅适用于该活动,那么您可以取消onPause中的任务(假设它不仅仅是轮换更改)。

否则,有各种策略可以保持跨活动的AsyncTasks。看到这个question的一些想法。这commonsware blog也有一个跨屏幕旋转保持AsyncTask的例子。

相关问题