web-dev-qa-db-ja.com

AndroidのUIスレッドで実行されているかどうかを確認するにはどうすればよいですか?

実行中のコードがメインスレッド(UIスレッド)で実行されているかどうかを確認するにはどうすればよいですか?
SwingではisEventDispatchThreadメソッドを使用します...

44
Arutha

SDKにそのためのメソッドがあるようには見えません。チェックは ViewRoot クラスで行われ、Thread.currentThread()を、コンストラクターで割り当てられているが公開されていないクラスメンバーと比較することで行われます。

このチェックが本当に必要な場合は、実装するためのいくつかのオプションがあります。

  1. android.view.ViewRoot $ CalledFromWrongThreadExceptionをキャッチする
  2. post ビューへのRunnableとチェックThread.currentThread()
  3. Handler を使用して同じことを行う

一般的に、正しいスレッドにいるかどうかはcheckingではなく、確認するだけコードが常に実行されるようにしますUIスレッド上(2または3を使用)。

12
Josef Pfleger

Looper.getMainLooper()。getThread()を使用してUIスレッドを取得します。次の式を使用して、それが現在のスレッドであるかどうかを確認できます。

Looper.getMainLooper().getThread() == Thread.currentThread()
111
Dan Syrstad

次の場合はUIスレッドです。

Looper.myLooper() == Looper.getMainLooper()

ソースAOSPソースコード: ManagedEGLContext.Java#L100SharedPreferencesImpl.Java#L470Instrumentation.Java#L1650など

76
balazsbalazs

runOnUiThread を使用することもできます。UIスレッドで実行されるrunnableのみが必要です

9
michael

メインスレッドにいるかどうかを知りたい場合は、次を試してみてください。

Context c = **Get a Context**;
Thread.currentThread() == c.getMainLooper().getThread();

もちろん、私は間違っている可能性があり、これはあなたのアプリを完全に爆破する可能性があります。

2
cesar