取消异步任务并按下后退按钮返回上一个活动

时间:2014-08-28 08:55:06

标签: android android-asynctask callback

这个问题在这个论坛已经多次了,我已经在Progress Dialog上使用CancelListener实现了它,它运行正常。但是有一个问题。当我单击后退按钮时,它会按预期返回到上一个活动。但是当我点击屏幕的任何其他部分时(即在活动的对话框或UI上),它也会取消对话框并返回到上一个活动。如何阻止这种情况发生?

 class LoadAllCategories extends AsyncTask<String, String, String> {

    int flag=0;


    public LoadAllCategories(CategoryActivity categoryActivity) {

        OnCancelListener cancelListener=new OnCancelListener(){
            @Override
            public void onCancel(DialogInterface arg0){
                finish();
            }
        };
         pDialog = new ProgressDialog(CategoryActivity.this);
         pDialog.setMessage("Loading Topics...");
         pDialog.setIndeterminate(true);
         pDialog.setCancelable(true);
         pDialog.setOnCancelListener(cancelListener);
    }

@Override
    protected void onPreExecute() {
        super.onPreExecute();

        category.setVisibility(View.INVISIBLE);
        company.setVisibility(View.INVISIBLE);
        pDialog.show();
    }

这是我的onDestroy方法杀死AsyncTask -

 @Override
     protected void onDestroy() {


      if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED)
      {
         mTask.cancel(true);
       }  

         super.onDestroy();

     }

最后我还覆盖了onBackPressed -

 @Override
        public void onBackPressed() {
            super.onBackPressed();
            if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED)
            {
                mTask.cancel(true);
            }          
            Intent intent_main = new Intent(CategoryActivity.this,MainActivity.class);
            intent_main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent_main);
            finish();

        }

另外,我想澄清一下我是否怀疑onBackpressed是否需要被覆盖,还是Cancellistener会这样做。

由于

2 个答案:

答案 0 :(得分:1)

您需要覆盖onBackPress()并编写代码以取消asynctask。因为你这样做,请确保根据条件编写代码,否则,你可能没有任何方法可以使用以前的活动。

if(asynctaskrunFlag) {
// Code to cancel asynctask
} else {
super.onBackPressed();
} that is,

if (mTask != null && mTask.getStatus() != AsyncTask.Status.FINISHED)
     {
        mTask.cancel(true);
     } else {
        super.onBackPressed();
    } 

答案 1 :(得分:-1)

你应该使用

dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);