【问题标题】:Runnable, Thread, RunOnUIThread可运行,线程,RunOnUIThread
【发布时间】:2015-10-06 16:22:51
【问题描述】:

今天,我设法通过使用 Runnable 处理插入/更新和删除一些数据库内容的一段代码,大大加快了我的 Android 应用程序的速度。但是我也使用了 RunOnUiThread() 和一个普通的 Thread() 但我不知道这三个之间有什么区别。我知道 ASyncTask,但是您如何选择使用什么以及主要区别是什么?

解释/链接到另一个网站会很好。

亲切的问候。

【问题讨论】:

  • Thread 运行 关闭 MainThread i.e UIrunOnUIThread() 运行 on 主线程!
  • @Jordy, here 你可以检查使用 Runnable 和 Thread 的区别。至于 RunOnUIThread - 要在您的视图中应用更改,它应该无效并重新布局。而这些动作只能在UI线程中执行,所以RunOnUIThread是一种实现方式。
  • 你们已经让我明白了一些事情。谢谢你。只是一个小问题,我不知道什么行动会占用很多资源。例如,我知道对我的数据库进行操作需要更多资源,但仅此而已。还有什么“重”?

标签: android multithreading runnable


【解决方案1】:

默认情况下,您编写的大部分代码都在 UI 线程(即主线程)上运行。关于Views的一些操作必须在UI线程上执行。消耗大量资源的操作应该在 UI 线程之外执行。

您可以通过调用new Thread(Runnable).start() 来启动一个新的Thread,然后该任务将在非UI 线程上执行。但建议使用像ExecutorService 这样的线程池来执行此操作,因为它会重用线程。

对于AsyncTaskdoInBackground() 中的代码在来自AsycTask 的静态线程池的非 UI 线程上运行,而 onPostExecuted() 在 UI 线程上执行。所以你应该在onPostExecuted()做UI操作。

使用Handler 时,handleMessage() 代码运行的位置基于您传递给Handler 的构造函数的Looper。默认是Looper.getMainLooper(),所以它在UI线程上运行。

【讨论】:

  • 很好的答案,将研究 ExecutorService。现在你的回答对我帮助最大。非常感谢。
【解决方案2】:

当您从普通线程修改 UI 上的某些值时,例如 (textBox.text),它会引发异常。所以你必须在那里使用 RunonUiThread() 来与 UI 共享值并同时异步运行。

normalThreadMethod(){
textBox.text = "Test";  //Exception   
}

RunOnUIThread(){
textbox.text = "Test"; //no error
}

【讨论】:

  • 感谢您的解释,我明白 RunOnUiThread 的目的。我的问题中没有说明这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多