0

我想在后台执行一些任务AsynTask。如下图所示:取消与后退按钮的asynctask

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。其实,我是这样测试的。两秒钟后立即按下硬锁键。并检查数据库,我发现所有的记录都被插入。为什么只要doInBackground()完成其工作就不会被呼叫?

最后一个问题是,我想显示一个AlertDialog与是和不Button,当硬按键被按下,而ProgressDialog仍然可见。然后,如果按下,则应该消失ProgressDialog,并且应该停止doInBackground()工作。如果没有被按下,那么只有AlertDialog应该被解雇,并且ProgressDialog应该仍然可见。

请帮我解决我的疑惑。

+0

看看我的这个答案是否有帮助:http://stackoverflow.com/a/15947770/450534 – 2013-04-24 08:21:33

回答

0

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

我想,当您关闭对话框时,需要一些时间来检查数据库记录,并在此期间doInBackground继续,直到所有记录插入DB.So当您检查您的数据库时,请参阅插入所有记录。

而且onPostExecute()在UI线程立即被调用doInBackground(Object []对象)返回后(如果任务没有被取消)。例如执行此的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用yes和 没有按键,...

你有一个方法添加到您的AsyncTask类,它显示具有所需功能的警报对话框,并存储对任务的引用,并覆盖Activity的方法。执行onBackPressed()时,调用Task实例的方法。虽然知道不能取消inserting progress如果你想要没有记录插入数据库,你可以在后台删除它们,插入后!

+0

好吧,我找到了你。我正在做没有任何循环的后台工作。但你能解释第一段和第二段吗,我有疑问。 – 2013-04-24 08:26:11

+0

好的。我明白了。以及在硬按键上显示AlertDialog的情况如何... – 2013-04-24 09:53:55

+0

@ shree202请再次查看我的答案。 – hasanghaforian 2013-04-24 10:10:08