437

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

4

12 に答える 12

779
Looper.myLooper() == Looper.getMainLooper()

これがtrueを返す場合は、UIスレッドを使用しています。

于 2012-07-10T10:12:18.473 に答える
134

以下のコードを使用して、現在のスレッドがUI/メインスレッドであるかどうかを知ることができます

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

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

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

これは同様の質問です

于 2012-07-10T10:14:04.973 に答える
68

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

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

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

Looper.getMainLooper().isCurrentThread()

LooperAPIを参照してください。呼び出しLooper.getMainLooper()には同期が含まれることに注意してください(ソースを参照)。戻り値を保存して再利用することにより、オーバーヘッドを回避したい場合があります。

   *クレジットgreg7gkbおよび2cupsOfTech

于 2015-12-02T20:42:23.867 に答える
27

ソリューションを要約すると、それが最良のソリューションだと思います。

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
    }
});
于 2016-12-22T10:02:55.980 に答える
7

確認してもいい

if(Looper.myLooper() == Looper.getMainLooper()) {
   // You are on mainThread 
}else{
// you are on non-ui thread
}
于 2018-11-27T10:24:02.083 に答える
3

はじめに:この投稿には「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
}

これを思い出す前に検索したのは少し恥ずかしかったですが、うまくいけば他の誰かの助けになるでしょう!

于 2019-08-27T13:47:00.587 に答える
1

プロセスIDは同じですが、スレッドIDは異なるandroidddmslogcatで確認できます。

于 2012-07-10T10:18:09.077 に答える
1

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
}
于 2019-01-16T08:00:38.063 に答える
1

まずはメインスレッドかどうかを確認してください

Kotlinで

fun isRunningOnMainThread(): Boolean {
    return Thread.currentThread() == Looper.getMainLooper().thread
}

Javaの場合

static boolean isRunningOnMainThread() {
  return Thread.currentThread().equals(Looper.getMainLooper().getThread());
}
于 2022-01-09T10:07:56.897 に答える
1

この行をログに記録するだけで、「main」と出力されます。

Thread.currentThread()。name

于 2022-03-01T08:21:13.320 に答える
-1

簡単なトーストメッセージは、クイックチェックとしても機能します。

于 2021-01-19T14:41:27.477 に答える
-6

Thread.currentThread()。isDaemon()を試すことができます

于 2016-11-29T13:36:23.203 に答える