web-dev-qa-db-ja.com

現在のスレッドがメインスレッドではないかどうかを調べる方法

特定のコードを実行しているスレッドがメイン(UI)スレッドかどうかを確認する必要があります。どうすればこれを達成できますか?

341
Charlie-Blake
Looper.myLooper() == Looper.getMainLooper()

これがtrueを返す場合、あなたはUIスレッドにいます!

636
Carnal

現在のスレッドがUI /メインスレッドであるかどうかを知るために以下のコードを使うことができます。

if(Looper.myLooper() == Looper.getMainLooper()) {
   // Current Thread is Main Thread.
}

またはこれを使うこともできます

if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
   // Current Thread is Main Thread.
}

これは似たような質問です

107
AAnkit

最善の方法は、最も明確で最も堅牢な方法です。

Thread.currentThread().equals( Looper.getMainLooper().getThread() )

ランタイムプラットフォームがAPIレベル23(Marshmallow 6.0)以上の場合

Looper.getMainLooper().isCurrentThread()

Looper API を参照してください。 Looper.getMainLooper()の呼び出しには同期が含まれることに注意してください( source を参照)。戻り値を格納してそれを再利用することで、オーバーヘッドを回避することをお勧めします。

*credit greg7gkb and 2cupsOfTech

46
Michael Allan

解決策をまとめると、それが最良の方法だと思います。

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
    }
});
20

確認できます

if(Looper.myLooper() == Looper.getMainLooper()) {
   // You are on mainThread 
}else{
// you are on non-ui thread
}

あなたは、プロセスIDは同じになりますがスレッドIDは異なりますAndroidのddms logcatでそれを確認することができます。

1
Vishwanath.M

これを序文として許可します。この投稿には「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
}

これを覚える前に検索したことは少し恥ずかしかったが、うまくいけば他の人の助けになるだろう!

0
ThatOneGuy

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
}
0
Mehdi Dehghani