如何放弃Android线程?

Igo*_*nko -2 time multithreading android block

我面临一个非常烦人的问题.我有一个执行代码可能需要几十秒.最后,我需要获得该计算的结果.

如果我只在主线程上执行代码,Android会弹出告诉线程被阻塞并询问我们是否要强制阻止.

原则是正常的,每个操作系统内核都需要知道我们的代码仍处于活动状态且未被阻止.

所以我的问题是如何告知Android我们还没死?例如,相当于Sleep(0)或ProcessMessage()或任何东西......但是告诉Android我们没有死,因为我们只是在等待或执行很长时间的事情......

请不要回答我:"让你的计算在一个单独的线程中",因为问题将完全相同.主线程仍然需要坐下来知道线程何时完成及其结果.

Ash*_*thi 6

您不应该运行访问数据库,Internet的任何进程,或者在UI线程上花费更长的时间.2秒.

Asynctask是一种非常强大的方法,允许您进行线程计算,同时仍然能够在预定点更新UI.学会爱它.

在让用户知道的情况下,在预执行块上显示请等待微调器对话框,并使其在后执行块上消失.

编辑:深入研究一下:asynctask有三个块在UI线程onPreExecute,onPostExecute和onProgressUpdate上运行.在这些块中,您可以更新UI.在doInBackground块中,它是自己的线程,因此在处理时不会阻止UI.

在实践中,您可以进行设置以通知onPreExecute中正在发生进程,在onProgressUpdate期间通知用户进度,然后在onPostExecute块期间显示最终信息/清除任何请稍候的对话框.它专门用于解决您正在讨论的确切问题.

通过在UI线程上运行将系统锁定超过4秒的任何进程都将导致向用户显示无响应错误.

http://developer.android.com/reference/android/os/AsyncTask.html

  • 如下所述,我可能会抓住这个问题,但AsyncTask被用作*方式*更多的是一个主力而不是它应该.人们在AsyncTasks中做的许多事情 - 特别是网络活动 - 在IntentService中会做得更好....而且,顺便说一下,在Honeycomb之后,你根本无法从UI线程触摸网络. (3认同)