2

基本的な Java の世界から来て、新しい Runnable を作成し、それを新しい Thread に渡して start を呼び出すことで、スレッドを生成する方法があることを知っています。何かのようなもの:

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

new Thread( r ).start()

Android の世界に加わった今、Android エコシステムは、スレッドを生成する他のいくつかの方法を提供しているようです。それらの 1 つは、Activity.runOnUiThread (UI で何かを実行するため) と Handler.post( runnable ) です。

私が疑問に思っているのは、新しいスレッドを生成するための Android の好ましい方法は何かということです。私は次のような多くのケースを見ます:

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

新しい Thread 古い方法を作成するのではなく、Handler を使用してスレッドを生成する正当な理由はありますか?

ありがとう。エフ

4

3 に答える 3

2

AysncTask フレームワークを確認してください。標準のJavaスレッドを使用できますが、それがGoogleがスレッドを処理する方法を望んでいるようです。

于 2012-04-04T18:52:06.437 に答える
1

あなたが示した方法のハンドラーは、実際には新しいスレッドを生成しません。ハンドラーはスレッドではなく、あるスレッドが別のスレッドにコードを実行するように指示する IPC の手段です。同じ古い方法でスレッドを生成しますが、ハンドラーはそれらのスレッドがより適切に通信するのに役立ちます。

たとえば、通常の方法でバックグラウンドで生成したスレッドがあるとします。

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(新しい UIUpdater(results)); }

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

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

または、 AsyncTaskフレームワークを使用して、Android でスレッドとハンドラーを管理することもできます。

于 2012-04-04T18:59:37.953 に答える
0

ハンドラーはスレッドを生成するのではなく、postUIスレッドへの新しいタスクを生成することになっています。IMOスレッドを生成する方法は、実行可能スレッドまたは拡張スレッドを直接介するJavaの方法です。androidの連中は、ExecutorをAsyncタスクにラップし、UIスレッドで直接実行されるメソッドと、タスクをバックグラウンドで実行するメソッドを公開しました。

于 2012-04-04T18:57:37.090 に答える