java - AsyncTask 在方法(.cancel)之后仍然运行

标签 java android android-asynctask

AsyncTask 在调用 new myTask.cancel() 方法后仍然运行。我在按下后退按钮或使用微调器更改 fragment 时调用该方法。我已经记录了增量的进度,即使在调用 myTask.cancel 之后,增量仍然在上升。

我的 AsyncTask 类

 public class myTask extends AsyncTask<Void, Integer, String> {
        private static final String TAG = "myTask";
        private ProgressBar budgetProgressBar=null;
        private TextView textView1;
        double b_val,e_val;
        int position;
        private Context mContext;

        public myTask(){
        }


        public myTask(double b_val ,double e_val,ProgressBar budgetProgressBar, TextView textView1) {
            this.b_val = b_val;
            this.textView1=textView1;
            this.e_val = e_val;
            pStatus = (int) e_val;
            this.budgetProgressBar= budgetProgressBar;
            position = (int) budgetProgressBar.getTag();
            maxBudget = (int) this.b_val;
        }


        int pStatus;
        int maxBudget;


        @Override
        protected void onPreExecute() {
            budgetProgressBar.setMax(maxBudget);
            budgetProgressBar.setVisibility(View.VISIBLE);

               budgetProgressBar.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
    //        }
        }

        @Override
        protected String doInBackground(Void... params) {

            int incrementor =10;


                for (int i = incrementor; i<=pStatus && !isCancelled(); i+=incrementor){

                    if (isCancelled()){
                        Log.d(TAG, "doInBackground: CANCELLED");
                        break;
                    }

                    try {

                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    publishProgress(i);
                }


            return "Complete";
        }


        @Override
        protected void onProgressUpdate(Integer... p) {

            super.onProgressUpdate(p);
            Log.d(TAG, "onProgressUpdate: ");
            if ((int) budgetProgressBar.getTag() == position){
                budgetProgressBar.incrementProgressBy(p[0]);
                budgetProgressBar.setProgress(p[0]);
                textView1.setText(p[0]+"/"+maxBudget);
               // Log.d(TAG, "Setting progress to " + p[0]);

                double calc =(e_val/b_val)*100;
                if (calc>100){
                    calc-=100;
                    textView1.setText("-"+ ((int) calc)+"%");
                }else{
                    textView1.setText(((int) calc)+"%");
                }

            }

        }





    }

取消异步任务

new myTask().cancel(true);

最佳答案

AsyncTask#cancel 不会停止 doInBackground 任务,即使方法名称表明如此。 doInBackground 会一直运行到最后,它会在最后调用 onCancel 而不是 onPostExecute

因此,您可能希望向 AsyncTask 添加一个可变字段标志并将其设置为已取消,例如

AsyncTask
private volatile boolean isRunning = true;

public void cancelTask() // sets isRunning to false

并且您将检查 isRunning 而不是 isCancelled()

关于java - AsyncTask 在方法(.cancel)之后仍然运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44412836/

相关文章:

java - 将 Java 解释为 PHP 或 Laravel

java - 在 Java 中使用 double 保持精度

android - 5000 毫秒后显示第二个警报对话框

android - AsyncTask,Insert,在 Android 中选择错误的执行顺序

java - 如何将数据从单独的线程类传递到 Android 中的 Activity

java - 如何重新检查 android-saripaar 中的字段?

java - Lwjgl 3白屏

java - android 事件监听器中的相对布局问题 : one child's listener is getting applied to all children

java - 直到我滑动 ViewPager 标题才会出现

java - 使用 Retrofit 库的 NullPointerException - Android