【问题标题】:Difference between android runOnUiThread and simple code in javaandroid runOnUiThread和java中简单代码的区别
【发布时间】:2017-05-28 16:58:24
【问题描述】:

我是 android 应用程序开发的初学者。我正在使用 android 中的线程。我读过关于在主 UI 上运行代码的runOnUiThread(如果我没记错的话?我猜。)。

我的问题是主 UI 上的普通代码和 runOnIUThread 内的代码有什么区别。

示例:1

class A
{
getDataFromServer(foo);//Code on mainUI
}

示例:2

getActivity.runOnUiThread(new Runnable(){
@Override
public void run(){
getDataFromServer(foo);
}
});

这两个例子有什么区别。请帮助我。你的回答对我来说是一个新的学习。

【问题讨论】:

  • 如果您想在非 UI 线程中更新 UI,则使用 runOnUiTread()
  • 如果你不想使用 runOnUiThread () 然后使用 AsyncTask ,它有 preExecute 和 postExecute 与 UI 交互。
  • 如果,我将更新 UI 表单 runOnUiThread 可以线程内的代码进入长进程,它会阻止进一步执行(ANR)

标签: android multithreading android-runonuithread


【解决方案1】:

假设您的意思是 UIThread 代码的简单代码,

什么是线程?

一个线程定义了一个正在运行的进程

第一个 runOnUiThread ..

UI 线程 上运行指定的操作。 如果当前线程是 UI 线程,然后立即执行操作。如果当前 thread 不是 UI 线程,动作被发布到事件队列 UI 线程。

什么是UIThread

  • 应用程序的执行主线程
  • 您的大部分应用程序代码将在 onCreateonPauseonDestroyonClick 等处运行。

    所以很简单任何导致 UI 更新或更改的事情都必须在 UI 线程上发生

当您显式后台生成一个新线程来完成工作时,此代码不会在 UIThread 上运行。现在,如果您想做一些改变怎么办用户界面? 那么欢迎您runOnUiThread

当您想从非 UI 线程更新您的 UI 时,您必须使用 runOnUiThread()。例如,如果您想从后台线程更新您的 UI。你也可以使用Handler 来做同样的事情。

【讨论】:

  • runOnUiThread 可以阻止进一步的执行,换句话说,如果线程进入长进程,它可以创建 ANR 吗?
  • 这取决于。与您的任务..如果有任何类型的进程,您应该使用处理程序developer.android.com/guide/components/… t 为这些后台线程提供执行可以修改 UI 的代码的能力。他们通过将 UI 修改代码放在一个 Runnable 对象中并将其传递给 runOnUiThread 方法来做到这一点。
  • Activity.runOnUiThread() 是更通用处理程序的一个特例。使用 Handler,您可以在自己的线程中创建自己的事件查询。通常,使用使用默认构造函数实例化的处理程序并不意味着“代码将在 UI 线程上运行”。默认情况下,处理程序绑定到实例化它们的线程。因此,如果您怀疑这种 ANR,请使用处理程序
【解决方案2】:

通常您的代码在您的 UI 线程上执行。对于耗时较长的任务(例如网络请求等),您将使用后台任务(Handler、AsyncTask、Thread...)。

由于您的视图只能从 UI 线程触摸,因此如果您在后台线程中执行代码并且需要从该后台线程更新您的视图,则使用 runOnUiThread()

【讨论】:

  • 也就是说runOnUiThread在后台运行代码?它可以创建 ANR 吗?
  • 不,你调用runOnUiThread 你的后台线程在你的主线程上执行代码
  • 如果,我会使用这个....new Thread(new Runnable() { (At)Override public void run() { runOnUiThread(new Runnable() { (At)Override public void run() { //这里的代码 } }); } }).start();
【解决方案3】:

要解释“为什么”Android 具有“runOnUiThread()”选项,重要的是要了解 java 仅用于创建 Android 使用的字节码 (dex)。手机上运行的代码不是java。

此外,Android 线程“可以”有一个叫做“looper”的东西。这个“looper”是通过队列按顺序处理“任务(技术上可运行的和消息)”的。默认情况下,“主 ui 线程”已经附加了一个活套。

这意味着您创建的 runnable 已放入主 UI 线程的 looper 队列中。 (这就是为什么 runnable 不会立即运行,而是会“快速”/“很快”运行)

您使用 runnable 在 UI 线程上运行代码的原因是因为您处于您创建的其他“后台线程”中......并且希望以某种方式更新 UI。 (只有 UI 线程可以与 UI 交互)

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多