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还会出现。实际上,我是这样测试的。两秒钟后,我立即按下了硬返回键。并检查了数据库,我发现所有的记录都被插入了。为什么onPostExecute()不在doInBackground()完成工作后立即调用?

最后一个问题是,我想在仍然可见的情况下按下硬返回键时显示AlertDialogyes 和 no 。然后,如果按下是,则应该消失并且应该停止工作。如果没有按下,那么只有应该被解除,并且应该仍然可见。ButtonProgressDialogProgressDialogdoInBackground()AlertDialogProgressDialog

请帮我解决我的疑惑。

4

1 回答 1

0

如果您将某行代码放在doInBackground只执行一次而不是循环中,则在执行任务后无法取消它。但是如果您在其中有循环或其他定期运行的命令,您可以将setCancel(true)其用于您的任务和isCanceled()在循环执行语句之前检查任务的值。

我猜当您关闭对话框时,检查数据库记录需要一些时间,并且在此期间doInBackground一直持续到所有记录都插入到数据库中。所以当您检查数据库时,请查看所有记录都已插入。

在doInBackground onPostExecute()(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。如果您希望没有记录插入到数据库中,您可以在插入后在后台将它们删除!

于 2013-04-24T08:18:59.050 回答