2012-12-20 45 views
75

runOnUiThread()とLooper.getMainLooper()。post()を使用してAndroidのUIスレッドでタスクを実行することに違いがある場合は誰にでも教えてください。runOnUiThreadとLooper.getMainLooper()。Androidの投稿

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

UIスレッドで何かを実行する必要があるとの議論を探しているわけではありません。いくつかのことはできません。また、多くのことができないはずですが、(AsyncTaskの起動など) UIスレッドから実行されなければならない(MUST)。

おかげで、
R.

+4

'runOnUiThread'がすでにUIスレッドであるかどうかをチェックし、' Message'として投稿するのではなく直接タスクを実行する点が異なります。 – zapl

+1

ありがとう。あなたはそれを答えに変換してください、私はそれを受け入れることができますか? – Rich

+0

また、UIスレッドで何かが実行されているかどうかを確認するためのコードもいくつか書いてありますので、手動でインクルードするのは非常に簡単です。 – Rich

答えて

149

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

経由Looper.getMainLooper()

Runnable task = getTask(); 
    new Handler(Looper.getMainLooper()).post(task); 

Activity#runOnUiThread()

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

のみDIF経由あなたは現在のスレッドがすでにUIスレッドであるかどうかをチェックして、それを直接実行します

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

ので、UIスレッドからそれを行うときフェレンスです。メッセージとして投稿すると、現在のUIスレッドメソッドから戻るまで実行が遅延します。

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

+2

偉大な答え、ありがとう! – Boy