1. ホーム
  2. java

ProgressDialogのAsyncTask内でLooper.prepare()を呼んでいないスレッドでハンドラを作成できない

2023-07-21 16:03:48

質問

なぜこのエラーが発生するのか理解できません。私はバックグラウンドでいくつかのプロセスを実行するために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() によって、条件I:

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

を試すと、いつも downloadSpinnerProgressDialog.show() というエラーが出ます。

何かアイデアはありますか?

どのように解決するのですか?

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