2009-12-03 16 views
29

アンドロイドにActivity.runOnUiThreadまたはHandler.post(runnable action)を使用する場合の相違点/利点/欠点は何ですか?Activity.runOnUiThread(実行可能アクション)とHandler.post()の違いは何ですか?

+2

同様の質問: [Handler.post(Runnable r)とActivity.runOnUiThread(Runnable r)の違い](http://stackoverflow.com/questions/7452884/difference-between-handler-postrunnable-r-and) - 活動 - runonuithreadrunnable) –

答えて

22

Activity.runOnUiThreadは、その名前が示すように、UIを現在担当しているスレッドでRunnableを実行します。そのため、CPU集約型のタスクを使用すると、短時間の間UIが応答しなくなる可能性があります。逆に、Handlerは、スレッドの作成、コードの実行、完了時のUIへの通知(Handler.sendMessageなど)を提供します。

私ができるよりも、この優れたハンドラの状態のためのドキュメント:

プロセスは、あなたの アプリケーション用に作成されると、そのメインスレッドが を管理するの面倒をメッセージキュー を実行する を専用されていますトップレベルのアプリケーションオブジェクト (アクティビティ、ブロードキャストレシーバなど) とそれらが作成するウィンドウ。 独自のスレッドを作成することができ、 はHandlerを通じてメイン アプリケーションスレッドと通信して通信を戻すことができます。 これは、以前と同じ投稿 またはsendMessageメソッドを呼び出すことによって行われますが、新しいスレッドからは となります。与えられた の実行可能ファイルまたはメッセージは、ハンドラのメッセージ にスケジューリングされ、適切な場合に処理されます。

0

Activity.runOnUiThread()は、より汎用的なハンドラの特殊なケースです。 Handlerを使用すると、独自のスレッド内で独自のイベントクエリを作成できます。デフォルトコンストラクタでインスタンス化されたハンドラを使用しても、一般に「コードはUIスレッドで実行される」という意味ではありません。デフォルトでは、ハンドラはインスタンス化されたThreadにバインドされています。あなたは、それを行うにはハンドラを使用しているrunOnuiThread()メソッドの実装をチェックすると、

Handler mHandler = new Handler(Looper.getMainLooper()); 

さらに: は、UI(メイン)と結合することが保証されているハンドラあなたは、このようにメインルーパーにバインドさHandlerobjectを作成する必要がありますスレッドを作成します物事:あなたは上記のコードから見ることができるようにrunOnUiThread()がUIスレッドから呼び出された場合

public final void runOnUiThread(Runnable action) { 
     if (Thread.currentThread() != mUiThread) { 
      mHandler.post(action); 
     } else { 
      action.run(); 
     } 
    } 

は、Runnableをアクションは、直ちに実行されます。さもなければ、それはHandlerにポストします。ハンドラは後である時点で実行されます。

関連する問題