web-dev-qa-db-ja.com

Handler.post(Runnable r)とActivity.runOnUiThread(Runnable r)の違い

違いはありますか

new Handler.post(Runnable r);

そして

activity.runOnUiThread(Runnable r)
35
VinceFR

runOnUiThreadは基本的に、AsyncTaskを呼び出す前に、進行状況ダイアログを表示したり、UI操作を行ったりするのに適しています。スレッド実行の途中でUIを更新したい場合は、UIを更新するHandlerを作成し、スレッドを実行し続けること(テキストビューを定期的に更新するなど)が最善の方法です。数秒後、タイマー機能と言います。

7
Shafi

公式 Handler docsから

ハンドラ

ハンドラーの主な用途は2つあります。

(1)メッセージと実行可能ファイルを将来のある時点で実行されるようにスケジュールする。

(2)自分のスレッドとは異なるスレッドで実行されるアクションをエンキューする。

要するに、ハンドラーは異なるRunnableを管理するために使用されます。

runOnUiThread

これは、UIスレッドで非UI操作を実行するために使用されます。たとえば、AsyncTaskのdoInBackground()から画面を更新する場合は、runOnUiThread()内のUIを更新するコードの一部を記述する必要があります。しかし、これはUIをブロックします。

19
Lalit Poptani

Handlerが作成されたスレッドにアタッチされます。

handler.post(Runnable)を使用して、ハンドラーが接続されているスレッドでコードを実行できます。

Activity.runOnUIThread(Runnable)は常に、アクティビティのUIThreadで指定されたランナブルを実行します。内部的には、次のように構築されたときにActivityが作成するハンドラーを介して行います。

final Handler mHandler = new Handler();

したがって、runonUiThradコードは次のようになります。

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

現在のスレッドがUIスレッドでないかどうかを確認できるように、以前に参照したメンバーハンドラーに特定の実行可能オブジェクトをポストします。呼び出し元がすでにuiスレッド上にある場合、それは単にランナブルを呼び出します。

コードをRad here にします。

2
Guy