特定のコードを実行しているスレッドがメイン(UI)スレッドかどうかを確認する必要があります。どうすればこれを達成できますか?
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.
}
最善の方法は、最も明確で最も堅牢な方法です。
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
ランタイムプラットフォームがAPIレベル23(Marshmallow 6.0)以上の場合
Looper.getMainLooper().isCurrentThread()
Looper API を参照してください。 Looper.getMainLooper()
の呼び出しには同期が含まれることに注意してください( source を参照)。戻り値を格納してそれを再利用することで、オーバーヘッドを回避することをお勧めします。
*credit greg7gkb and 2cupsOfTech
解決策をまとめると、それが最良の方法だと思います。
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
}
あなたは、プロセスIDは同じになりますがスレッドIDは異なりますAndroidのddms logcatでそれを確認することができます。
これを序文として許可します。この投稿には「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
}
これを覚える前に検索したことは少し恥ずかしかったが、うまくいけば他の人の助けになるだろう!
Xamarin.Android
ポート:(C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
使用法:
if (IsMainThread) {
// you are on UI/Main thread
}