태그 보관물: android-asynctask

android-asynctask

Android 기본 사항 : UI 스레드에서 코드 실행

UI 스레드에서 코드를 실행한다는 관점에서 다음과 같은 차이점이 있습니다.

MainActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        Log.d("UI thread", "I am the UI thread");
    }
});

또는

MainActivity.this.myView.post(new Runnable() {
    public void run() {
        Log.d("UI thread", "I am the UI thread");
    }
});

private class BackgroundTask extends AsyncTask<String, Void, Bitmap> {
    protected void onPostExecute(Bitmap result) {
        Log.d("UI thread", "I am the UI thread");
    }
}


답변

그것들이 모두 동일한 순 효과를 갖지만, 그것들 중 정확히 동일한 것은 없습니다.

제 1 및 제 2의 차이는가 될 일 경우이다 에서 코드를 실행시에 메인 프로그램 스레드, 첫 번째는 ( runOnUiThread())를 실행한다 Runnable바로. 두 번째 것 ( post()) Runnable은 이미 기본 애플리케이션 스레드에 있더라도 항상 이벤트 큐의 끝에 놓 입니다.

세 번째 인스턴스는 인스턴스를 만들고 실행한다고 가정하면 BackgroundTask스레드 풀에서 스레드를 가져 와서 기본 no-op을 실행 doInBackground()하기 전에 많은 양의 작업을 수행하기 전에 많은 시간을 낭비 합니다 post(). 이것은 세 가지 중 가장 효율적입니다. AsyncTask실제로 사용 하지 않고 백그라운드 스레드에서해야 할 작업이있는 경우 사용하십시오 onPostExecute().


답변

나는 HPP comment 에서 하나를 좋아하는데 , 매개 변수없이 어디서나 사용할 수 있습니다 :

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        Log.d("UI thread", "I am the UI thread");
    }
});

답변

네 번째 방법은 Handler

new Handler().post(new Runnable() {
    @Override
    public void run() {
        // Code here will run in UI thread
    }
});

답변

Pomber의 답변은 받아 들일 만하지 만 새로운 객체를 반복적으로 만드는 것에 열광하는 것은 아닙니다. 최상의 솔루션은 항상 메모리 호그를 완화하려는 솔루션입니다. 예, 자동 가비지 수집이 있지만 모바일 장치의 메모리 절약은 모범 사례의 범위에 속합니다. 아래 코드는 서비스에서 TextView를 업데이트합니다.

TextViewUpdater textViewUpdater = new TextViewUpdater();
Handler textViewUpdaterHandler = new Handler(Looper.getMainLooper());
private class TextViewUpdater implements Runnable{
    private String txt;
    @Override
    public void run() {
        searchResultTextView.setText(txt);
    }
    public void setText(String txt){
        this.txt = txt;
    }

}

다음과 같이 어디에서나 사용할 수 있습니다.

textViewUpdater.setText("Hello");
        textViewUpdaterHandler.post(textViewUpdater);

답변

Android P부터 다음을 사용할 수 있습니다 getMainExecutor().

getMainExecutor().execute(new Runnable() {
  @Override public void run() {
    // Code will run on the main thread
  }
});

로부터 안드로이드 개발자 문서 :

이 문맥에 관련한 메인 thread로 큐에 넣어 진 태스크를 실행하는 Executor를 돌려줍니다. 응용 프로그램 구성 요소 (활동, 서비스 등)에 대한 호출을 디스패치하는 데 사용되는 스레드입니다.

로부터 CommonsBlog :

컨텍스트에서 getMainExecutor ()를 호출하여 기본 애플리케이션 스레드에서 작업을 실행할 실행자를 얻을 수 있습니다. Looper와 커스텀 Executor 구현을 사용하여 이것을 달성하는 다른 방법이 있지만, 이것은 더 간단합니다.


답변

조각에 사용해야 할 경우 사용해야합니다

private Context context;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
    }


    ((MainActivity)context).runOnUiThread(new Runnable() {
        public void run() {
            Log.d("UI thread", "I am the UI thread");
        }
    });

대신에

getActivity().runOnUiThread(new Runnable() {
    public void run() {
        Log.d("UI thread", "I am the UI thread");
    }
});

호출기 조각과 같은 일부 상황에서는 널 포인터 예외가 있기 때문에


답변

안녕 얘들 아,이 하나의 기본적인 질문은 내가 멀리 말해

핸들러 사용

new Handler().post(new Runnable() {
    @Override
    public void run() {
        // Code here will run in UI thread
    }
});