35

作業中にprogressDialogを表示するAsyncTaskがあります(doInBackground内からrunOnUiThreadを呼び出して進行状況ダイアログ表示します)。

実行中に戻るボタンを使用して操作をキャンセルできるようにしたい。他の誰かがこの問題を抱えています:progressDialogの実行中にBACKボタンが機能しない

なんらかの理由でそのスレッドに返信できないため、別のスレッドを開始する必要がありますか?! (別の日の別の質問)

私は Sandy と同じ考えを持っていましたが、progressDialogが表示されている間、このコードが呼び出されることはありません。これはなぜですか? メイン アクティビティ クラス内に実装しましたが、progressDialogは一時的にクラスからフォアグラウンド フォーカスを奪いますか?

4

9 に答える 9

46

まず、 からダイアログを表示しOnPreExecute、 で非表示にしOnPostExecute、必要に応じて進行状況を公開して変更する必要があります。(こちらをご覧ください

今あなたの質問に: aを引数としてProgressDialog.show()取ることができます。進行状況ダイアログ インスタンスOnCancelListenerを呼び出すものを提供する必要があります。cancel()

例:

    @Override
    protected void onPreExecute(){
        _progressDialog = ProgressDialog.show(
                YourActivity.this,
                "Title",
                "Message",
                true,
                true,
                new DialogInterface.OnCancelListener(){
                    @Override
                    public void onCancel(DialogInterface dialog) {
                        YourTask.this.cancel(true);
                        finish();
                    }
                }
        );
    }

_progressDialogProgressDialogメンバーはどこですかYourTask

このクラスは、API レベル 26 で非推奨になりました。ProgressDialog は、ユーザーがアプリを操作できないようにするモーダル ダイアログです。このクラスを使用する代わりに、アプリの UI に埋め込むことができる ProgressBar などの進行状況インジケーターを使用する必要があります。または、通知を使用して、タスクの進行状況をユーザーに通知することもできます。リンク

于 2011-03-10T01:04:08.010 に答える
5

戻るボタンをキャンセルのように扱うのは正しい方法ではありません。
ユーザーがダイアログ ボックスの外で画面に触れた場合にも、キャンセルが発生します。この 2 つのアクションを区別したいのではないですか?

正しいアプローチは、ProgressDialog クラスを拡張し、onBackPressed メソッドをオーバーライドすることです。

private class SubProgressDialog extends ProgressDialog {
    public SubProgressDialog(Context context) {
        super(context);
    }
    @Override
    public void onBackPressed() {
        /** dismiss the progress bar and clean up here **/
    }
}


public void displayProgressBar(){
    progressBar = new SubProgressDialog(this);
    progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    progressBar.setCancelable(false);
    progressBar.setMessage(getString(R.string.authorizing));        
    progressBar.show();   
    new Thread(new Runnable() {
      public void run() {
      }
       }).start();     

}

setCancelable(false) に注意してください。ここでも、戻るボタンが単純なキャンセルとは異なることを強調しています。
また、これにより、ユーザーからの他のタッチ入力が効果的に無視されます。

于 2013-02-27T23:27:55.380 に答える
2

javano ...標準的な手法であるasyncTaskとProgressDialogを使用してシナリオをテストしました。私のテストでは、progressDialog が表示されているときに戻ってきたときに、progressDialog が閉じられ、バックグラウンド スレッドが引き続き実行されます。runOnUiThread を呼び出す必要がある理由がわかりません。

それで:

onPreExecute で progressDialog を表示する doInBackground で長時間実行されるタスクを配置する onPostExecute で progressDialog を閉じる 次のように、入力パラメーターを長時間実行するタスクに渡します。

new MyAsynch().execute(password,inString);

onPause の asynchTask と progressDialog を cancel()

protected void onPause() {
    super.onPause();
    if (asynch != null) {asynch.cancel(true);}
    if (progress != null){progress.cancel();}
}

日本航空

ここにいくつかのコードがあります。

于 2011-03-10T06:10:12.010 に答える
1

以下のコードをコピーして Async タスク内に貼り付けるだけです。

ProgressDialog ダイアログ;

@Override
protected void onPreExecute() {

    dialog = new ProgressDialog(MainActivity.this) {
        @Override
        public void onBackPressed() {
            dialog.cancel();
            dialog.dismiss();
        }
    };
    // dialog.setTitle("file is..");//its optional If u want set title in progress
    // bar
    dialog.setMessage("Loading file....");
    dialog.setCancelable(false);

    dialog.show();

}
于 2015-04-18T05:43:33.510 に答える
0

これに従ってください。キャンセル ボタンは非同期でのみ表示され、キャンセル ボタンをクリックすると終了が呼び出されます。

protected void onPreExecute() {


        dialogx.setMessage("Loading... Please Wait...");
        dialogx.setCancelable(false);
        dialogx.setButton(DialogInterface.BUTTON_NEGATIVE,
                "Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

                dialogx.dismiss();
                GetDataTask.this.cancel(true);
                finish();
            }
        });
        dialogx.show();


    }
于 2014-12-31T11:10:02.010 に答える