回答:
Looper.myLooper() == Looper.getMainLooper()
これがtrueを返す場合は、UIスレッドを使用しています。
以下のコードを使用して、現在のスレッドがUI /メインスレッドであるかどうかを確認できます
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
またはこれを使用することもできます
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
スレッドがルーパーに関連付けられていない場合はnullを返します。したがって、どちらも安全で同じ結果が得られますが、最初のものはマップ内を検索してルーパーとそれに関連するスレッドを見つけ、他のことを行う間、少し遅くなります。
最善の方法は、最も明確で最も堅牢な方法です。*
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
または、ランタイムプラットフォームがAPIレベル23(Marshmallow 6.0)以上の場合:
Looper.getMainLooper().isCurrentThread()
Looper APIをご覧ください。呼び出しにLooper.getMainLooper()
は同期が含まれることに注意してください(ソースを参照)。戻り値を保存して再利用することで、オーバーヘッドを回避したい場合があります。
* greg7gkbと2cupsOfTechのクレジット
Looper.myLooper() == Looper.getMainLooper()
していますが、これはあまり明確ではないと思います。私はgreg7gkbを信用しています。
equals
あり、したがってにフォールバックしますが、==
将来的には変更される可能性があります。だから私は答えを修正しました。
解決策を要約すると、私はそれが最良のものだと思います:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
そして、UIスレッドで何かを実行したい場合は、これを使用できます。
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
確認してもいい
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
この前書きを許可します。この投稿に「Android」タグが付いていることを確認しましたが、私の検索は「Android」とは関係がなく、これが私の一番の結果でした。そのため、Android SO 以外の Javaユーザーがここにアクセスする場合は、次のことを忘れないでください。
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
これを設定した後、コードの他の場所で、メインスレッドで実行するかどうかを簡単に確認できます。
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
これを思い出す前に私が探していた少し恥ずかしいことですが、うまくいけば他の人の役に立つでしょう!
プロセスIDは同じですが、スレッドIDが異なるandroid ddms logcatで確認できます。
あなたはThread.currentThread()。isDaemon()を試すことができます