AndroidでのrunOnUiThreadとLooper.getMainLooper()。post


99

runOnUiThread()とLooper.getMainLooper()。post()を使用してAndroidのUIスレッドでタスクを実行することの間に違いがあるかどうか誰かに教えてもらえますか?

runOnUiThreadは静的ではないActivityメソッドであるため、アクティビティを表示できないクラスで何かをコーディングする必要がある場合は、Looper.getMainLooper()。post()の方が便利だと判断できます。インターフェース)。

UIスレッドで何かを実行する必要があるかどうかのディスカッションを探していませんが、実行できないことや実行できないことはたくさんありますが、いくつかのこと(AsyncTaskの起動など)は、 UIスレッド。

ありがとう、
R。


6
runOnUiThreadそれがすでにUIスレッドであるかどうかをチェックし、タスクをMessage
-zapl

1
ありがとう。それを回答に変換していただけますか?
リッチ

また、UIスレッドで何かが実行されているかどうかを確認するコードをすでに作成しているため、手動で含めるのは非常に簡単です。
リッチ

回答:


191

以下は、バックグラウンドスレッドから呼び出された場合と同じように動作します。

  • を使用して Looper.getMainLooper()

    Runnable task = getTask();
    new Handler(Looper.getMainLooper()).post(task);
  • を使用して Activity#runOnUiThread()

    Runnable task = getTask();
    runOnUiThread(task);

唯一の違いは、UIスレッドからそれを行う場合です。

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

現在のスレッドがすでにUIスレッドであるかどうかを確認し、直接実行します。メッセージとして投稿すると、現在のUIスレッドメソッドから戻るまで実行が遅延します。

RunnableUIスレッドでを実行する3番目の方法もあります。これはView#post(Runnable)、UIスレッドから呼び出された場合でも、常にメッセージをポストします。これはView、コードが実行される前にが適切に構築され、レイアウトされていることを保証するので便利です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.