Android의 UI 스레드에서 작업을 실행하기 위해 runOnUiThread ()와 Looper.getMainLooper (). post ()를 사용하는 것 사이에 차이점이 있는지 누구든지 말할 수 있습니까 ??
내가 결정할 수있는 유일한 것은 runOnUiThread가 비 정적 Activity 메서드이기 때문에 Looper.getMainLooper (). post ()는 Activity를 볼 수없는 클래스에서 무언가를 코딩해야 할 때 더 편리하다는 것입니다 (예 : 인터페이스).
UI 스레드에서 무언가를 실행해야하는지에 대한 논의를 찾고 있지 않습니다. 어떤 것은 할 수없고 많은 것은해서는 안되는 것이 있지만, 어떤 것 (AsyncTask 시작과 같은)은 반드시 실행되어야합니다. UI 스레드.
고마워,
R.
답변
다음은 백그라운드 스레드에서 호출 될 때 동일하게 작동합니다.
-
사용
Looper.getMainLooper()
Runnable task = getTask(); new Handler(Looper.getMainLooper()).post(task);
-
사용
Activity#runOnUiThread()
Runnable task = getTask(); runOnUiThread(task);
유일한 차이점은 UI 스레드에서 수행 할 때입니다.
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
현재 스레드가 이미 UI 스레드인지 확인한 다음 직접 실행합니다. 메시지로 게시하면 현재 UI 스레드 메서드에서 돌아올 때까지 실행이 지연됩니다.
Runnable
UI 스레드에서 를 실행하는 세 번째 방법도 있습니다.이 방법 은 UI 스레드 View#post(Runnable)
에서 호출 된 경우에도 항상 메시지를 게시합니다. 이는 View
코드가 실행되기 전에이 제대로 구성되고 레이아웃 이 있는지 확인하기 때문에 유용합니다 .