AndroidでUIスレッドを検出する方法は?


117

Thread.currentThread()アプリケーションのAndroidシステムUIスレッドかどうかを検出するための堅牢な方法はありますか?ある種の同期が不要であることを保証するために、
1つのスレッド(たとえば、uiスレッド)のみが私の状態にアクセスすることを表明するモデルコードにいくつかの表明を入れたいと思います。


ここで私の答えを参照してください:stackoverflow.com/a/41280460/878126
Android開発者

回答:


199

UIスレッドのIDを決定する一般的な方法は、Looper#getMainLooperを使用することです。

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

APIレベル23 以降では、メインルーパーで新しいヘルパーメソッドisCurrentThreadを使用して、もう少し読みやすい方法があります

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

6
stackoverflow.com/questions/11411022/… この答えもいいです)
UnknownJoe

44

私はそれが最善の方法だと思います:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }

よく働く。ありがとうございました!
香港

3
equals参照を比較するだけなので、使用する必要はありません。さらに、それらは両方とも静的です。
mr5

8

APIレベル23以降、Looperこれには素晴らしいヘルパーメソッドがありisCurrentThreadます。あなたはこれを取得してmainLooper、それが現在のスレッドのものかどうかを次のように確認できます:

Looper.getMainLooper().isCurrentThread()

それは実質的に同じです:

Looper.getMainLooper().getThread() == Thread.currentThread()

しかし、少し読みやすく覚えやすいかもしれません。



2

ルーパーをチェックする以外に、スレッドID をログアウトしようとした場合onCreate()UIスレッド(メインスレッド) IDが常に1に等しいことがわかります。したがって、

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}

私はこれが真実であり、常にそうであることを裏付ける公式文書を見つけることができません。リンクはありますか?
intrepidis

これは、マルチスレッドの動作を監視したいときにlogcatで見つけたものです。スレッドIDを出力してみてください
yushulx

8
この値はお使いのデバイスやAndroidのバージョンによって異なる可能性があるため、これはお勧めしません。現時点ですべてのAndroidデバイスに当てはまっていたとしても、それが今後のバージョンでも引き続き当てはまるという保証はありません。onCreate()の実行時にスレッドIDをクラスメンバーに保存することは、私にはもう少し合理的です。
personne3000

1

クラスでrunOnUiThreadメソッドを使用できませんでしたActivityか?

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29


4
私のアプリケーションは動作していますが、複数の作成者がいて、かなり大きく複雑になっています。私がやりたいことは、別のスレッドからGUIスレッドからのみ呼び出されるように設計されたメソッドを誰かが呼び出している場合に、間違いをキャッチするアサートである追加のセーフティネットを追加することです。
ParDroid 2010年

現在、runOnUiThreadを使用するとUXがフラッシュするバグを修正しています。
fobbymaster 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.