web-dev-qa-db-ja.com

ProgressDialogのAsyncTask内でLooper.prepare()を呼び出していないスレッド内にハンドラーを作成できません

このエラーが発生する理由がわかりません。 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()を試すたびにエラーが発生します。

アイデアはありますか?

78
mlevit

メソッドshow()ser-Interface(UI)thread から呼び出す必要がありますが、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();
    }
}
105

私は同様の問題を抱えていましたが、この質問を読んで、UIスレッドで実行できると思いました:

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

私のためにトリックをするようです。

81
hyui

私もこの作品を作るのに苦労しました。私にとっての解決策はヒュイとコンスタンチンの両方の答えを使うことでした。

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

}
1
caiocpricci2
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();
0