AsyncTask奇怪

时间:2014-01-10 13:05:10

标签: android multithreading android-asynctask

我正在研究从Android相机获得的实时帧。我不会处理所有的帧,但是当我这样做时,我创建一个Thread以保持ui线程的响应。问题是,在这个新线程中我想在某个时刻更新服务器,所以我开始Asynctask

根据文档,Asynctasks应该由UI线程启动。所以我使用runOnUiThread启动它们。根据文档,发生的情况是,如果我更改活动或更改配置,活动将重新启动,我的任务将终止,我永远不会得到服务器的响应(保存在数据库表中)。我很好奇,所以我尝试从工作线程开始Asynctasks,然后!即使活动已更改,我也会收到服务器响应。有趣的是,如果我的UI线程编号为1,而我的工作线程编号为2,则服务器的响应处理发生在1而不是2.我可以或多或少地理解这一点,因为线程2已经完成,所以asynctask可能会回落到线程1,但我真的不明白为什么这个线程仍在运行,如果我在其他活动?有谁知道发生了什么?

我知道即使这种效果看起来非常有用,但使用它并不是一个好主意。但我只是好奇它为什么会这样运作。

1 个答案:

答案 0 :(得分:0)

当配置更改(一般而言)时,重新创建活动。那时,你有2个Activity实例。旧的待定集合和新集合。假设旧的有一个工作线程W. W正在等待收集。但是,它很有可能在收集之前继续工作。 (如果你创建一个带有无限while循环的线程,你可以注意到它会停止但最终会停止。)

当您从UI线程启动AsyncTask时,结果将发布到UI线程(在onPostExecute中传递)。当活动处于挂起垃圾回收时,onPostExecute将不会发布到DONE的ui线程。

但是,当您从工作线程启动AsyncTask时,只要调用线程(您的W线程)存在,就会发布结果。答案的第一段描述了“有没有”。