Android의 runOnUiThread 대 Looper.getMainLooper (). post


99

Android의 UI 스레드에서 작업을 실행하기 위해 runOnUiThread ()와 Looper.getMainLooper (). post ()를 사용하는 것 사이에 차이점이 있는지 누구든지 말할 수 있습니까 ??

내가 결정할 수있는 유일한 것은 runOnUiThread가 비 정적 Activity 메서드이기 때문에 Looper.getMainLooper (). post ()는 Activity를 볼 수없는 클래스에서 무언가를 코딩해야 할 때 더 편리하다는 것입니다 (예 : 인터페이스).

UI 스레드에서 무언가를 실행해야하는지에 대한 논의를 찾고 있지 않습니다. 어떤 것은 할 수없고 많은 것은해서는 안되는 것이 있지만, 어떤 것 (AsyncTask 시작과 같은)은 반드시 실행되어야합니다. UI 스레드.

고마워,
R.


6
runOnUiThread이미 UI 스레드인지 확인 하고 작업을 a로 게시하는 대신 직접 실행 하는 것 외에는 차이가 없습니다 .Message
zapl

1
감사. 대답으로 변환 해 주시면 받아 들일 수 있습니까 ??
Rich

또한 UI 스레드에서 무언가가 실행되고 있는지 확인하는 코드를 이미 작성 했으므로 수동으로 포함하는 것이 매우 간단합니다.
Rich

답변:


192

다음은 백그라운드 스레드에서 호출 될 때 동일하게 작동합니다.

  • 사용 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 스레드 메서드에서 돌아올 때까지 실행이 지연됩니다.

RunnableUI 스레드에서 를 실행하는 세 번째 방법도 있습니다.이 방법 은 UI 스레드 View#post(Runnable)에서 호출 된 경우에도 항상 메시지를 게시합니다. 이는 View코드가 실행되기 전에이 제대로 구성되고 레이아웃 이 있는지 확인하기 때문에 유용합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.