2011-11-22 181 views
1

我有一个活动,创建一个工作线程转换图片列表中的图片。是的,在onPause()/ onResume()我启动并停止工作线程。跳绳对工人的肉,我有一个循环,当它被中断时结束,主要的变量设置为空(或其他工作人员):Android神秘:线程消失?

public void run() 
    { 
     while(transitionWorkerThread == this) 
     { 
      try 
      { 
       Log.d(getLogTag(), "Ready to sleep."); 
       Thread.sleep(5000); 
       Log.d(getLogTag(), "ready to transition, is running? " + (transitionWorkerThread == this)); 
       if(transitionWorkerThread == this) 
       { 
        Log.d(getLogTag(), "ready to post image change"); 
        MAIN_THREAD_HANDLER.post(new Runnable() 
          { 
           @Override 
           public void run() 
           { 
            Log.d(getLogTag(), "ready to go to next image"); 
            imageSlideView.goNextImage(); 
            Log.d(getLogTag(), "supposedly went to next image"); 
           } 
          }); 
        Log.d(getLogTag(), "posted image change, is running? " + (transitionWorkerThread == this)); 
       } 
      } 
      catch(final InterruptedException interruptedException) 
      { 
       Log.d(getLogTag(), "Worker interrupted."); 
      } 
      catch(final Throwable throwable) 
      { 
       Log.d(getLogTag(), "some sort of picture error?", throwable); 
      } 
     } 
     Log.d(getLogTag(), "dropped out of picture loop, worker: " + transitionWorkerThread + " is us? " + (transitionWorkerThread == this)); 
    } 

现在,这里的奥秘:线程消失!它会在一段时间后停止执行!认真!看看这个日志输出:

11-22 13:13:40.186: D/PictureFrameActivity(941): Ready to sleep. 
11-22 13:13:40.191: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:13:40.191: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:13:45.253: D/PictureFrameActivity(941): ready to transition, is running? true 
11-22 13:13:45.253: D/PictureFrameActivity(941): ready to post image change 
11-22 13:13:45.253: D/PictureFrameActivity(941): posted image change, is running? true 
11-22 13:13:45.253: D/PictureFrameActivity(941): Ready to sleep. 
11-22 13:13:45.253: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:13:45.253: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:13:50.272: D/PictureFrameActivity(941): ready to transition, is running? true 
11-22 13:13:50.272: D/PictureFrameActivity(941): ready to post image change 
11-22 13:13:50.272: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:13:50.272: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:13:50.301: D/PictureFrameActivity(941): posted image change, is running? true 
11-22 13:13:50.301: D/PictureFrameActivity(941): Ready to sleep. 
11-22 13:13:55.325: D/PictureFrameActivity(941): ready to transition, is running? true 
11-22 13:13:55.325: D/PictureFrameActivity(941): ready to post image change 
11-22 13:13:55.325: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:13:55.325: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:13:55.331: D/PictureFrameActivity(941): posted image change, is running? true 
11-22 13:13:55.331: D/PictureFrameActivity(941): Ready to sleep. 
11-22 13:14:00.011: E/dalvikvm(76): No free temp registers 
11-22 13:14:00.011: E/dalvikvm(76): Jit: aborting trace compilation, reverting to interpreter 
11-22 13:14:00.365: D/PictureFrameActivity(941): ready to transition, is running? true 
11-22 13:14:00.365: D/PictureFrameActivity(941): ready to post image change 
11-22 13:14:00.365: D/PictureFrameActivity(941): ready to go to next image 
11-22 13:14:00.365: D/PictureFrameActivity(941): supposedly went to next image 
11-22 13:14:00.371: D/PictureFrameActivity(941): posted image change, is running? true 
11-22 13:14:06.042: D/dalvikvm(941): GC_CONCURRENT freed 2106K, 58% free 3260K/7751K, external 13519K/13938K, paused 15ms+10ms 
11-22 13:14:06.541: I/dalvikvm(941): Jit: resizing JitTable from 1024 to 2048 
11-22 13:14:11.111: D/dalvikvm(941): GC_CONCURRENT freed 2051K, 57% free 3342K/7751K, external 13519K/13938K, paused 19ms+17ms 
11-22 13:14:15.121: D/dalvikvm(941): GC_CONCURRENT freed 2174K, 59% free 3216K/7815K, external 13519K/13938K, paused 20ms+20ms 
11-22 13:14:19.271: D/dalvikvm(941): GC_CONCURRENT freed 2028K, 59% free 3235K/7815K, external 13519K/13938K, paused 24ms+21ms 

你最后一次通知后“?张贴图像的变化,正在运行真实的”,线程刚刚消失,并且从此杳无音信!看代码,只有几个选择:我可以看到“工作中断”或“某种图像错误”,甚至“退出图像循环”。如果一切顺利,它应该循环回来并说“准备睡觉”。

但我没有看到这个主题的其他内容!就好像它在循环结束时被暂停。当然,Android不会暂停一个线程。这是一个谜。

更新:我已将整个工作线程取出并放入由活动调用的单独本地服务中。工作者线程在几圈之后仍然消失。这太疯狂了 - 工作者线程是服务的常见用法。可怕的事情正在发生......但我仍然感激有人给我一个线索,看看它是什么。

回答

0

尤里卡!这根本不是线程问题。这是我的错(惊喜!)。

我对原始代码并不完全真实。它实际上是这样的:

final long sleepLength = transitionIntervalManager.pollState(); 
try 
{ 
    Log.d(getLogTag(), "Ready to sleep for "+sleepLength); 
    Thread.sleep(sleepLength); 

transitionIntervalManager是看中类我已经写了实际上随着时间的推移缓慢过渡。我有一个错误,所以当它到达最后(最慢)的转换时间时,调用pollState会进入无限循环并且不会返回。因为该方法在第一个日志之前被调用,所以日志永远不会被写入 - 而我的线程仍然会试图进行下一个转换。 (难怪我的笔记本电脑风扇!)

我试图简化代码,我没有意识到我简化了问题---我的意思是,这样一段简单的代码怎么会有错误。 ;)

0

我不知道为什么你的线程被杀死,但我的猜测是它与活动的生命周期有关。现在在Android中有一个很好的类,它允许轻松地线程化并定期将代码发回UI界面。查看AsyncTask并使用publishProgress函数更新您的UI对象。再次我不确定你的代码有什么问题,但Android线程的最佳实践是使用这个类。

+0

你确定*这是什么建议在这种情况下?首先,AsyncTask建立在线程之上,就像我的线程一样。其次,AsyncTasks是从一组线程中提取出来的 - 我们是否真的希望它的后台方法每隔几秒就会进入休眠状态,并基本上永远持续下去,从而剥夺了AsyncTask的池?最后,我们如何知道我的线程正在被杀死?在哪里可以找到文档,指出Android会简单地杀死一个线程,而不中断它,并在日志中不提供任何内容来表明它是这样做的? AsyncTask如何防止这种情况发生? –