[java] 현재 스레드가 메인 스레드가 아닌지 확인하는 방법

특정 코드 조각을 실행하는 스레드가 기본 (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()에는 동기화가 포함됩니다 ( 소스 참조). ). 리턴 값을 저장하고 재사용하여 오버 헤드를 피할 수 있습니다.

   * 신용 greg7gkb2cupsOfTech


답변

솔루션을 요약하면 이것이 최선이라고 생각합니다.

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 이외의 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는 다른 안드로이드 ddms logcat에서 확인할 수 있습니다.