-2

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

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

那么原理是正常的,每个操作系统内核都需要知道我们的代码还活着并且没有被阻塞。

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

请不要回答我:“让您在单独的线程中进行计算”,因为问题完全相同。主线程仍然需要坐下来了解线程何时完成及其结果。

4

3 回答 3

6

您不应运行任何访问数据库、互联网或在 UI 线程上花费超过 0.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

于 2013-01-23T18:44:21.763 回答
1

我可能会对此感到震惊,但实际上,只在适当的情况下使用 AsyncTask !(阅读:退出它!)

Virgil Dobjanschi 的回答在这里:

http://www.youtube.com/watch?v=xHXn3Kg2IQE

..是真的,真的很好。它有点复杂,但通常并不比实际问题复杂。

虽然原始问题中没有很多细节,但解决问题的最佳方法可能(所有答案都同意)使用单独的线程。但是,到达该其他线程的最佳方式可能是在 IntentService 上触发一个意图。...然后 runOnUiThread 或 Handler 来获取响应。

于 2013-01-23T19:42:33.770 回答