1

根据文档,应该使用三个选项之一来从不同的线程访问 UI 线程。这些是选项:

  1. Activity.runOnUiThread(可运行)
  2. View.post(可运行)
  3. View.postDelayed(可运行,长)

我什么时候应该使用哪个?他们似乎都在 UI 线程的消息队列中添加了一个 Runnable。

我认为 postDelayed 仅在您想稍后安排 Runnable 时才真正有用,他们只提到它是因为它还在 UI 线程上运行 Runnable。

对于额外的混乱,还有 AsyncTask。我现在什么时候应该使用它?

4

5 回答 5

1

runOnUiThreadView.post完全相同,它们都向活动的Handler发送一个可运行对象。所以使用任何你喜欢的。

关于AsynchTask它不用于在 UI 线程上运行。但是在异步任务完成工作后,它会调用OnPostExcute在 UI 线程上调用的方法。

关于这个主题有一个非常棒的教程Here

于 2013-02-06T22:31:27.483 回答
1

如果您需要一种无需上下文即可返回到随处可用的 UI 线程的机制,您可以使用以下方法:

Handler handler = new Handler(Looper.getMainLooper());
handler.post(Runnable);
于 2013-02-06T22:42:00.197 回答
0

我总是选择 runOnUiThread,我认为这是在同一个 UI 线程上运行某些东西的最佳方式。AsyncTasks 很棘手,这是一个好主意,但如果您想使用新的东西,请使用加载器或 IntentService。

于 2013-02-06T22:26:38.297 回答
0

忘了AsyncTask,它不是在 UI 线程中运行代码,而是在AsyncTask UI 线程开始的后台线程中运行代码。

关于其他选项,请随意选择其中任何一个。如果您正在处理一个View对象,很可能您已经在 UI 线程上。因此,您最好保留对Activity来自其他线程的上下文的引用并调用runOnUiThread

于 2013-02-06T22:35:04.350 回答
0

我会推荐你​​使用AsyncTasks ,它们被设计用来在其他线程( doInBackground() )中进行艰苦的工作,然后与 UI 线程同步以推送工作结果(onPostExecute()),当然你可以定期更新 UI 与工作进度( onProgressUpdate() )。

如果你想在大于 HONEYCOMB 的 Android 版本上同时运行多个 AsyncTask,你可以使用我的小库:Android-AsyncTask-Executor

于 2013-02-06T22:36:22.570 回答