2

来自基本的 Java 世界,我知道有一种方法可以通过创建一个新的 Runnable 并将其传递给一个新的 Thread 并在其上调用 start 来生成一个线程。就像是:

Runnable r = new Runnable() {
   @Override
   public void run(){
   }
}

new Thread( r ).start()

现在加入 Android 世界,Android 生态系统似乎提供了一些其他方法来生成线程。其中之一是 Activity.runOnUiThread(用于在 UI 上完成工作)和 Handler.post(runnable)。

我想知道的是Android产生新线程的首选方式是什么。我确实看到了很多案例,例如:

Handler handler = new Handler()
handler.post( r )

是否有充分的理由使用 Handler 生成线程而不是创建新的 Thread 旧方式?

谢谢。叶夫

4

3 回答 3

2

查看AysncTask 框架。看起来这就是 Google 希望您处理线程的方式……尽管您可以使用标准的 java 线程。

于 2012-04-04T18:52:06.437 回答
1

您演示的处理程序实际上并没有产生一个新线程。处理程序不是线程,而是 IPC 的一种方法,让一个线程告诉另一个线程运行代码。您仍然以相同的旧方式生成线程,但 Handler 帮助这些线程更好地通信。

例如,假设您有一个 Thread 以通常的方式在后台生成:

Runnable r = new Runnable() {
   @Override
   public void run(){
   }
}

new Thread( r ).start()

它在后台运行并进行处理,但它需要根据进度更新 UI,因此它会回调 Activity:

onProgress(int progress) {
  // update UI
}

如果按原样运行该代码,它将引发异常,因为只允许 UI 线程更新 UI。处理程序可以像这样解决这个问题:

public void onProgress(int results) { mHandler.post(new UIUpdater(results)); }

private class UIUpdater implements Runnable {
  UIUpdater(int results) {
    //construct whatever...
  }

  @Override
  public void run() {
    //Update UI
  }
}

或者,您可以让 Android 通过AsyncTask框架为您管理线程和处理程序

于 2012-04-04T18:59:37.953 回答
0

处理程序不应该产生线程,而是post新任务到 UI 线程。IMO产生线程的方式是java方式,直接通过可运行或扩展线程。android 开发人员在 Async 任务周围包裹了一个 Executor,并公开了一些直接在 UI 线程中运行的方法,以及一个在后台运行您的任务的方法。

于 2012-04-04T18:57:37.090 回答