android-asynctask 안드로이드 - Android 기본 사항 : UI 스레드에서 코드 실행





백그라운드 종료 (7)


그것들은 모두 똑같은 효과가 있지만, 똑같은 것은 없습니다.

첫 번째와 두 번째의 차이점은 코드를 실행할 때 주 애플리케이션 스레드에있을 경우 첫 번째 애플리케이션 ( runOnUiThread() )이 Runnable 즉시 실행한다는 것입니다. 두 번째 ( post() )는 이미 주 응용 프로그램 스레드에 있더라도 Runnable 을 이벤트 큐의 끝에 배치합니다.

세 번째 것은 BackgroundTask 의 인스턴스를 생성하고 실행한다고 가정하면 스레드 풀에서 스레드를 가져 와서 기본 no-op doInBackground() 를 실행하고 결국 post() 에 해당하는 작업을 수행하기까지 많은 시간을 낭비하게됩니다. . 이것은 3 가지 방식 중 가장 효율적이지 않습니다. onPostExecute() 사용뿐만 아니라 실제로 백그라운드 스레드에서 수행 할 작업이있는 경우 AsyncTask 사용하십시오.

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");
    }
}



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);



나는 HPP 코멘트 에서 하나를 좋아한다, 어떤 매개 변수없이 어디에서든지 사용될 수있다 :

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    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
    }
});



Fragment에서 사용해야하는 경우에는 사용해야합니다.

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");
    }
});

호출기 프래그먼트와 같은 일부 상황에서는 널 포인터 예외가 있기 때문에




Handler 사용하는 네 번째 방법이 있습니다.

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



프로젝트 디버깅 중에 인증서가 만료되면 수동 제거를 수행해야합니다.

셸에서 adb uninstall <package_name> 을 실행하십시오.





android android-asynctask android-view android-ui