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



Answers

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

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

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



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

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






Related