0

でバックグラウンドでいくつかのタスクを実行しようとしていますAsynTask。以下のように:

class CheckTypesTask extends AsyncTask<Void, Void, Void> {

        ProgressDialog Asycdialog = new ProgressDialog(Home.this);
        String typeStatus;

        @Override
        protected void onPreExecute() {

            super.onPreExecute();

            Asycdialog.setMessage("First time initialization. Please wait...");
            Asycdialog.show();
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            create_database_and_tables();
            insert_in_questions();
            insert_in_answer_option();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // hide the dialog

            super.onPostExecute(result);

            database.close();
            Asycdialog.dismiss();
        }

問題は、ProgressDialogが表示されているときにハードバックキーを押すと、ProgressDialog. しかし、 を確認するDatabaseと、挿入されるすべてのレコードが正常に挿入されていることがわかりました。が仕事を終えても、いつか消えてProgressDialogも が表示され続ける理由がわかりdoInBackground()ませんが、なぜそうなのですか??ProgressDialog

私の次の質問は、挿入されるデータセットが十分に大きくない場合、なぜProgressDialogまだ表示されるのかということです。実際、私はこのようにテストしました。2秒後すぐにハードバックキーを押しました。データベースを確認したところ、すべてのレコードが挿入されていることがわかりました。onPostExecute()が作業を終了するとすぐに呼び出されないのはなぜdoInBackground()ですか??

そして最後の質問は、まだ表示されている間にハードバックキーが押されたときに、AlertDialogyes と noを表示したいということです。次に、はいを押すと、が消え、作業が停止します。いいえが押された場合、 のみが閉じられ、は引き続き表示されます。ButtonProgressDialogProgressDialogdoInBackground()AlertDialogProgressDialog

私の疑問を解決するのを手伝ってください。

4

1 に答える 1

0

doInBackgroundループではなく一度だけ実行されるコード行を配置した場合、タスクの実行後にそれをキャンセルする方法はありません。ただし、ループまたは定期的に実行される他のコマンドがある場合setCancel(true)は、タスクとisCanceled()ステートメントをループで実行する前に、タスクの値を確認してください。

ダイアログを閉じると、DBレコードのチェックに時間がかかり、その間doInBackground、DBにすべてのレコードが挿入されるまで続くと思います.DBをチェックすると、すべてのレコードが挿入されます.

またonPostExecute()、doInBackground(Object[]) が返された後、すぐに UI スレッドで呼び出されます (タスクがキャンセルされなかった場合)。たとえば、次の AsyncTask を実行します。

class Test extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... params) {
            System.out.println("End doInBackground");
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            System.out.println("Start onPostExecute");
        }

    }

ただし、ダイアログを閉じる前にいくつかのコマンドを追加しましたが、これはほとんど時間を消費せず、アクティビティの遷移 (ダイアログを閉じてアクティビティをフォアグラウンド化する) 自体も数回消費します。

編集:

そして最後の質問は、はいボタンといいえボタンを備えた AlertDialog を表示したいということです...

必要な機能を備えたアラート ダイアログを表示するメソッドを AsyncTask クラスに追加し、タスクへの参照を保存し、onBackPressed()Activity のメソッドをオーバーライドする必要があります。onBackPressed() が実行されると、Task インスタンスのそのメソッドを呼び出します。この方法でキャンセルinserting progressします。DBにレコードを挿入したくない場合は、挿入後にバックグラウンドで削除できます!!

于 2013-04-24T08:18:59.050 に答える