簡體   English   中英

取消“異步任務”並按“返回”按鈕返回到上一個活動

[英]Cancelling the Async Task and returning to previous activity on pressing Back Button

這個問題在這個論壇上已經很多次了,我已經在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會這樣做。

謝謝

您需要重寫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();
    } 

你應該用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM