web-dev-qa-db-ja.com

runOnUiThread vs Looper.getMainLooper()。post in Android

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

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

UIスレッドで何かを実行する必要があるかどうかについての議論を探していません。いくつかのことはできない、非常に多くのことはすべきではありませんが、いくつかのこと(AsyncTaskの起動など)はUIスレッド。

おかげで、
R。

91
Rich

バックグラウンドスレッドから呼び出された場合、次の動作は同じです。

  • 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-threadメソッドから戻るまで実行が遅延します。

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

179
zapl