Android에서 UI 스레드를 감지하는 방법은 무엇입니까?


117

Thread.currentThread()애플리케이션에 Android 시스템 UI 스레드가 있는지 감지하는 강력한 방법이 있습니까? 어떤 종류의 동기화가 필요하지 않도록하기 위해
하나의 스레드 ( 예 : ui 스레드) 만 내 상태에 액세스 한다고 주장하는 내 모델 코드에 몇 가지 주장을 넣고 싶습니다 .


여기 내 대답을 참조하십시오 : stackoverflow.com/a/41280460/878126
안드로이드 개발자

답변:


199

UI 스레드의 ID를 확인하는 일반적인 방법은 Looper # getMainLooper를 사용하는 것입니다 .

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

API 레벨 23 이상부터는 메인 루퍼에서 새로운 도우미 메서드 isCurrentThread 를 사용하는 약간 더 읽기 쉬운 접근 방식이 있습니다 .

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}


44

가장 좋은 방법은 다음과 같습니다.

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }

잘 작동합니다. 감사합니다!
Hong

3
equals참조 만 비교하고 있기 때문에 사용할 필요 가 없으며, 게다가 둘 다 정적입니다.
mr5

8

API 레벨 23 Looper부터는 멋진 도우미 메서드가 isCurrentThread있습니다. 다음 mainLooper과 같은 방법으로 현재 스레드에 대한 것인지 확인할 수 있습니다.

Looper.getMainLooper().isCurrentThread()

다음과 거의 동일합니다.

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

하지만 좀 더 읽기 쉽고 기억하기 쉬울 수 있습니다.



2

확인 외에 루퍼를 당신이 이제까지 시도하는 경우, 로그 아웃 스레드 ID에 onCreate(), 당신은 찾을 수있는 UI 스레드 (메인 스레드)를 ID가 항상 따라서 1로 동일

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}

이것이 사실임을 증명하는 공식 문서를 찾을 수 없으며 항상 그렇습니다. 링크가 있습니까?
intrepidis 2014 년

이것은 다중 스레드 동작을 모니터링하고 싶을 때 logcat에서 찾은 것입니다. 당신은 출력 스레드 ID를 시도 할 수 있습니다
yushulx

8
이 값은 기기 및 / 또는 Android 버전에 따라 다를 수 있으므로이 값을 사용하지 않는 것이 좋습니다. 지금은 모든 Android 기기에 적용 되더라도 이후 버전에서도 계속 적용된다는 보장은 없습니다. onCreate ()를 실행할 때 클래스 멤버에 스레드 ID를 저장하는 것이 나에게 조금 더 합리적으로 보입니다.
personne3000

1

수업에서이 runOnUiThread방법 을 사용할 수 Activity없나요?

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29


4
내 응용 프로그램은 작동하지만 여러 명의 작성자가 있으며 다소 크고 복잡해지고 있습니다. 내가하고 싶은 것은 여분의 안전망을 추가하는 것입니다. 누군가가 다른 스레드의 GUI 스레드에서만 호출되도록 설계된 메서드를 호출하는 경우 실수를 포착하는 어설 션입니다.
ParDroid

현재 runOnUiThread를 사용하면 UX가 깜박이는 버그를 수정하고 있습니다.
fobbymaster dec.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.