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