特定のコードを実行しているスレッドがメイン(UI)スレッドであるかどうかを確認する必要があります。どうすればこれを達成できますか?
12 に答える
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()
LooperAPIを参照してください。呼び出しLooper.getMainLooper()
には同期が含まれることに注意してください(ソースを参照)。戻り値を保存して再利用することにより、オーバーヘッドを回避したい場合があります。
*クレジットgreg7gkbおよび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
}
はじめに:この投稿には「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は異なるandroidddmslogcatで確認できます。
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
}
まずはメインスレッドかどうかを確認してください
Kotlinで
fun isRunningOnMainThread(): Boolean {
return Thread.currentThread() == Looper.getMainLooper().thread
}
Javaの場合
static boolean isRunningOnMainThread() {
return Thread.currentThread().equals(Looper.getMainLooper().getThread());
}
この行をログに記録するだけで、「main」と出力されます。
Thread.currentThread()。name
簡単なトーストメッセージは、クイックチェックとしても機能します。
Thread.currentThread()。isDaemon()を試すことができます