답변:
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.
}
Looper.myLooper()
스레드가 루 퍼와 연관되지 않은 경우 널을 리턴합니다. 따라서 둘 다 안전하고 동일한 결과를 갖지만 첫 번째는 맵 내부를 검색하여 루 퍼와 관련 스레드를 찾고 다른 작업을 수행하는 동안 약간 느립니다.
가장 좋은 방법은 가장 명확하고 강력한 방법입니다. *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
또는 런타임 플랫폼이 API 레벨 23 (Marshmallow 6.0) 이상인 경우 :
Looper.getMainLooper().isCurrentThread()
Looper API를 참조하십시오 . 호출 Looper.getMainLooper()
에는 동기화가 포함됩니다 ( 소스 참조). ). 리턴 값을 저장하고 재사용하여 오버 헤드를 피할 수 있습니다.
* 신용 greg7gkb 및 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
. 나는 greg7gkb를 신용합니다.
equals
하므로 다시로 넘어가 ==
지만 나중에 변경 될 수 있습니다. 그래서 대답을 수정했습니다.
솔루션을 요약하면 이것이 최선이라고 생각합니다.
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에서 확인할 수 있습니다.
Thread.currentThread (). isDaemon ()을 시도 할 수 있습니다