2

我很困惑为什么要更新处理程序、异步任务或 runOnUiThread 中的 ui 元素,如果您已经在 UI 线程上,请考虑以下片段,编号从 1 到 4:(出于演示目的,可能有语法错误)

// in MainActivity.java #1
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
     TextView name = (TextView)findViewById(R.id.name);
     name.setText("Name Changed!!");
}


// in MainActivity.java #2
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
     TextView name = (TextView)findViewById(R.id.name);
     handler.post(new Runnable() {
           public void run() {
               name.setText("Name Changed!!");
           }
          });
}

// in MainActivity.java #3
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
     TextView name = (TextView)findViewById(R.id.name);
     runOnUiThread(new Runnable() {
           public void run() {
               name.setText("Name Changed!!");
           }
          });
}

// in MainActivity.java #4
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
     ...same thing,...update textview in AsyncTask
}

 // in MainActivity.java #5
public void onCreate(Bundle bundle) {
     setContentView(R.layout.main);
      TextView name = (TextView)findViewById(R.id.name);
     name.post(new Runnable() {
           public void run() {
               name.setText("Name Changed!!");
           }
          });
}

正如您从示例 #1 - #4 中看到的那样,我不明白为什么您需要使用 #2、#3 或 #4,因为 #1 您已经在 UI 线程上!!!

换句话说,我说#1-#4 是相同的——即你想在 UI 线程/主线程上执行一些东西,所以告诉我为什么你会使用 #2、#3 或 #4,如果# 1 已经在 UI 线程上。

每个有什么区别?

请提供任何文档或实际用例的引用

谢谢你!!

4

3 回答 3

0

我发现很难说出你的问题到底是什么,但是关于你的论文的一些注释。

不,#1 到#4 不一样。

  • 有效性:是的,如果您已经在 UI 线程上并且没有昂贵的计算或冗长的 I/O 操作要做,那么没有必要从 #2 到 #4 进行选择。
  • 时机:根据情况,#2到#4的效果有一定的概率出现比#1晚一点。
  • 复杂性/等待:通常只有#4 能让你干净地等待阻塞 I/O 或进行冗长的计算。根据Handler,#2 也可能有效,但这不是 Handlers 的用途。
  • 处理程序:在您的#2 中,根本无法保证您使用的是主/UI 线程处理程序该代码可以很好地在非主/ UI 线程上运行。
  • 3是一种方便的方法。

所以不,它们与一般情况相去甚远。

附言

  • 优先级:取决于Thread您使用 a 时的代码类型,以及在ofHandler的任何默认情况下,您的代码将以后台优先级运行,并且必须与系统上的所有其他后台线程一起使用 10% 的 CPU 时间,除非你调整优先级。有关详细讨论,请参见此处doInBackground()AsyncTask

聚苯乙烯

既然你在评论中问“反过来”:

  • 如果您确定自己在 UI 线程上并且不进行计算和/或 I/O,则1 是最有效和最直接的

  • 2 仅在处理程序使用主/UI 线程时有效。为什么要使用它?如果您在代码中的某个位置,与任何可用的Contextor分离View,您仍然可以这样做newHandler(Looper.getMainLooper()),这为您Handler提供了 UI 线程。

  • 3 指ViewContext相关的便利方法。只要您手头有这些对象之一,您就可以使用它们在 UI 线程上执行某些操作。

  • 如果您正在执行昂贵的操作或等待,则必须使用 4。但是,AsyncTask这只是一个用于此目的的便利类,旨在用于相对较短的操作。

于 2013-04-23T05:10:06.037 回答
0

runOnUiThread如果您已经在 UI 线程上,则无需使用或您描述的任何其他情况。这些是为您不在 UI 线程中的情况提供的。

在此处阅读开发人员指南。它包括解释如果您尝试在 UI 线程之外的 UI 上执行操作会出现什么问题的示例,并解释了避免它们的各种选项。

但是在您的示例中,简单地说,您在一个活动中并且您没有产生任何其他线程,因此您在 UI 线程中并且不需要任何特殊方法来访问 UI。

于 2013-04-23T05:08:47.450 回答
0

1 这是在 UI 线程中更新 UI 的正确和最直接的方法

  • 如果您只想更新 UI,则不需要 #2 #3 和 #4

2当我们需要在单独的线程中执行任务时,专门使用处理程序

3 runonUI () 永远不会在 oncreate() 中使用,因为您已经在 UI 线程上。它用于从非 UI 线程更新 UI,例如从异步任务的 doinbackground()

4 异步任务不应该只用于更新 UI 元素,其主要目的是仅在活动的后台执行任务。尽管执行前和执行后功能可以更新 UI。

于 2013-04-23T05:16:24.430 回答