AsyncTask for ProgressDialog 내에서 Looper.prepare ()를 호출하지 않은 스레드 내부에 핸들러를 만들 수 없습니다.


78

이 오류가 발생하는 이유를 이해할 수 없습니다. AsyncTask를 사용하여 백그라운드에서 일부 프로세스를 실행하고 있습니다.

나는 가지고있다:

protected void onPreExecute() 
{
    connectionProgressDialog = new ProgressDialog(SetPreference.this);
    connectionProgressDialog.setCancelable(true);
    connectionProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    connectionProgressDialog.setMessage("Connecting to site...");
    connectionProgressDialog.show();

    downloadSpinnerProgressDialog = new ProgressDialog(SetPreference.this);
    downloadSpinnerProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    downloadSpinnerProgressDialog.setMessage("Downloading wallpaper...");
}

doInBackground()조건 에 따라 들어가면 :

[...]    
connectionProgressDialog.dismiss();
downloadSpinnerProgressDialog.show();
[...]

시도 할 때마다 downloadSpinnerProgressDialog.show()오류가 발생합니다.

아이디어가 있나요?

답변:


106

이 메서드 show()UI (사용자 인터페이스) 스레드 에서 호출되어야하며 , 디자인 된 doInBackground()주된 이유 인 다른 스레드에서 실행됩니다 AsyncTask.

당신은 전화를해야 show()에 하나 onProgressUpdate()또는에서 onPostExecute().

예를 들면 :

class ExampleTask extends AsyncTask<String, String, String> {

    // Your onPreExecute method.

    @Override
    protected String doInBackground(String... params) {
        // Your code.
        if (condition_is_true) {
            this.publishProgress("Show the dialog");
        }
        return "Result";
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
        connectionProgressDialog.dismiss();
        downloadSpinnerProgressDialog.show();
    }
}

3
그것은 나를 위해 속임수를 쓰지 않고 "AlertDialog.Builder builder = new AlertDialog.Builder (context);"를 시도했습니다. 빌더의 구성을 추가했습니다. onProgressUpdate 내부에 이것을 표시하려고하면 정확히 동일한 오류가 발생합니다. 어떤 아이디어?
ins0m

Konstantin에게 감사드립니다. publishProgress ()를 사용하여 모든 변수 유형으로 onProgressUpdate를 재정의 할 수 있다는 것을 몰랐습니다. 토스트 메시지로 간단히 업데이트하는 데 정말 도움이되었습니다.
wired00

81

비슷한 문제가 있었지만이 질문을 읽음으로써 UI 스레드에서 실행할 수 있다고 생각했습니다.

YourActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        alertDialog.show();
    }
});

나를 위해 트릭을 할 것 같습니다.


getActivity (). runOnUiThread (this :: mymethod); 감사합니다.
mortezahosseini

1

저도이 작업을하는 데 어려움을 겪었습니다. 저에게 해결책은 휴의 답변과 콘스탄틴 답변을 모두 사용하는 것이 었습니다.

class ExampleTask extends AsyncTask<String, String, String> {

// Your onPreExecute method.

@Override
protected String doInBackground(String... params) {
    // Your code.
    if (condition_is_true) {
        this.publishProgress("Show the dialog");
    }
    return "Result";
}

@Override
protected void onProgressUpdate(String... values) {

    super.onProgressUpdate(values);
    YourActivity.this.runOnUiThread(new Runnable() {
       public void run() {
           alertDialog.show();
       }
     });
 }

}

나는 물건에서 수행 생각한 onProgressUpdate()자동으로 UI 스레드에서 실행에 가고 있었다
누군가 어딘가에을

0
final Handler handler = new Handler() {
        @Override
        public void handleMessage(final Message msgs) {
        //write your code hear which give error
        }
        }

new Thread(new Runnable() {
    @Override
    public void run() {
    handler.sendEmptyMessage(1);
        //this will call handleMessage function and hendal all error
    }
    }).start();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.