Androidで、私のコードを実行しているスレッドがUIスレッドであるかどうかを知る方法はありますか?スイングでは、SwingUtilities.isEventDispatchThread()
がありました。 UIスレッドかどうか。Android SDKにこれを知らせる関数はありますか?
ここから借りた答え: 現在のスレッドがメインスレッドではないかどうかを確認する方法
Looper.myLooper() == Looper.getMainLooper()
すべてのAndroidアプリにはUIスレッドが1つしかないため、onCreate()などのアクティビティコールバックのどこかでIDを確認して保存し、後でそのスレッドのIDを保存されているスレッドと比較することができます。
mMainThreadId = Thread.currentThread().getId();
とにかく、UIスレッドで何かを実行し、アクティビティへの参照があるかどうかのチェックを省略して、
mActivity.runOnUiThread( new Runnable() {
@Override
public void run() {
...
}
});
これは、UIの場合、現在のスレッドで実行されるか、UIスレッドでキューに入れられることが保証されています。
はい、方法があります。現在のスレッドオブジェクトをメインロッパーのスレッドオブジェクトと照合します。メインルーパーは常にUIスレッドにあります。
boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();
ハムは実際にはAndroidアーキテクチャのため、すべてのアクティビティはメインスレッド、つまりUIスレッドで実行されます。したがって、アクティビティをコーディングする場合、アクティビティにあるものはすべてUIスレッドにあります。
そのため、Honeycombでは、メインスレッドでネットワーク呼び出しを行うときにエラーが追加されました。UIが完全にブロックされます。
したがって、デフォルトでは、実際には常にUIスレッドで作業しています。別のこと:明示的に別のスレッドにあるように要求しない限り、サービスはそのアプリケーションのアクティビティと同じスレッドで動作します。
じゃあ何をすればいいの ?