web-dev-qa-db-ja.com

このスレッドがUIスレッドであるかどうかを知る方法

Androidで、私のコードを実行しているスレッドがUIスレッドであるかどうかを知る方法はありますか?スイングでは、SwingUtilities.isEventDispatchThread()がありました。 UIスレッドかどうか。Android SDKにこれを知らせる関数はありますか?

22
user1730789
  1. ここから借りた答え: 現在のスレッドがメインスレッドではないかどうかを確認する方法

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

  2. すべてのAndroidアプリにはUIスレッドが1つしかないため、onCreate()などのアクティビティコールバックのどこかでIDを確認して保存し、後でそのスレッドのIDを保存されているスレッドと比較することができます。

    mMainThreadId = Thread.currentThread().getId();

  3. とにかく、UIスレッドで何かを実行し、アクティビティへの参照があるかどうかのチェックを省略して、

    mActivity.runOnUiThread( new Runnable() {
        @Override 
        public void run() {
        ...
        }
    });
    

これは、UIの場合、現在のスレッドで実行されるか、UIスレッドでキューに入れられることが保証されています。

40
Fenix Voltres

はい、方法があります。現在のスレッドオブジェクトをメインロッパーのスレッドオブジェクトと照合します。メインルーパーは常にUIスレッドにあります。

boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();
8
Cleosson

ハムは実際にはAndroidアーキテクチャのため、すべてのアクティビティはメインスレッド、つまりUIスレッドで実行されます。したがって、アクティビティをコーディングする場合、アクティビティにあるものはすべてUIスレッドにあります。
そのため、Honeycombでは、メインスレッドでネットワーク呼び出しを行うときにエラーが追加されました。UIが完全にブロックされます。

したがって、デフォルトでは、実際には常にUIスレッドで作業しています。別のこと:明示的に別のスレッドにあるように要求しない限り、サービスはそのアプリケーションのアクティビティと同じスレッドで動作します。

じゃあ何をすればいいの ?

  • あなたがあなたの活動で重い計算をしなければならないとき; 1つの解決策は、AsyncTask(別のスレッドを簡単に使用できるように設計されたクラス)を使用することです。 onExecute()のコードは別のスレッドで実行されます(ただし、postExecuteはメインスレッドで実行されることに注意してください)。もう1つは、AsyncTaskが実際に適応されていないときに、手動で新しいスレッドを開始することです。
  • コストのかかるバックグラウンドタスクを実行するサービスを作成する場合は、マニフェストのAndroid:process = ":my_process"属性を使用して別のスレッドで実行するようにします。この分離されたサービスと通信するにはAIDLを作成する必要がありますが、これは複雑な作業ではありません。
  • MediaPlayerなどの多くのオブジェクトには、メソッドの非同期バリエーションがあります。常にそれらを使用するようにしてください。
0
Teovald