我有一个活动,创建一个工作线程转换图片列表中的图片。是的,在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不会暂停一个线程。这是一个谜。
更新:我已将整个工作线程取出并放入由活动调用的单独本地服务中。工作者线程在几圈之后仍然消失。这太疯狂了 - 工作者线程是服务的常见用法。可怕的事情正在发生......但我仍然感激有人给我一个线索,看看它是什么。
你确定*这是什么建议在这种情况下?首先,AsyncTask建立在线程之上,就像我的线程一样。其次,AsyncTasks是从一组线程中提取出来的 - 我们是否真的希望它的后台方法每隔几秒就会进入休眠状态,并基本上永远持续下去,从而剥夺了AsyncTask的池?最后,我们如何知道我的线程正在被杀死?在哪里可以找到文档,指出Android会简单地杀死一个线程,而不中断它,并在日志中不提供任何内容来表明它是这样做的? AsyncTask如何防止这种情况发生? –