簡體   English   中英

為什么AsyncTask不停止?

[英]Why the AsyncTask doesn't stop?

嗨,謝謝您的關注,

我有以下代碼,

  • 按下按鈕時啟動AsyncTask

  • 釋放按鈕時應停止AsyncTask。

但這不會發生...

(當達到MAXX值時,AsyncTask一直持續到其自然結束)

請問我做錯了什么?

class right extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... unused) {
            while (x < MAXX) {
                if (x < MAXX)
                    x++;
                publishProgress();
                SystemClock.sleep(40);
            }
            return (null);
        }

        @Override
        protected void onProgressUpdate(Void... unused) {
            horizontal.scrollTo(x, 0);
            Log.e("x", Integer.toString(x));
        }

        @Override
        protected void onPostExecute(Void unused) {

        }
    }



    left.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            right righttask = new right();
            switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:
                righttask.execute();
                break;
            case MotionEvent.ACTION_UP:
                righttask.cancel(true);
                Log.e("","SHOULD STOP ASYNCTASK!!!");
                break;
            }
            return false;
        }
    });

將此添加到您的while循環中:

if (isCancelled()) break;

更多信息: AsyncTask的用法

看看文檔

還定義了doInBackGround()不會被取消。 因此,您應該在循環中檢查線程是否已取消,並按照文檔示例中的說明斷開/斷開線程。

所以你的代碼應該看起來不錯

        @Override
        protected Void doInBackground(Void... unused) {
            while (x < MAXX) {
                if (x < MAXX)
                    x++;
                publishProgress();
                if (isCancelled()) break;  //Add this line!
                SystemClock.sleep(40);
            }
            return (null);
        }

抱歉,我還要說幾件事:

  1. 類的名稱應以大寫字母開頭。
  2. 當您想遞增x時為什么不使用for循環
  3. 變量應以小寫字母開頭

因此通常您的代碼應如下所示:

class Right extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... unused) {
        for(int x = 0; x < MAXX; x++){

            publishProgress();
            if (isCancelled()) break;  //Add this line!            
            SystemClock.sleep(40);
        }
        return (null);
    }

    @Override
    protected void onProgressUpdate(Void... unused) {
        horizontal.scrollTo(x, 0);
        Log.e("x", Integer.toString(x));
    }

    @Override
    protected void onPostExecute(Void unused) {

    }
}


Right righttask;  //make it global!
left.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:
            righttask = new Right();
            righttask.execute();
            break;
        case MotionEvent.ACTION_UP:
            righttask.cancel(true);
            Log.e("","SHOULD STOP ASYNCTASK!!!");
            break;
        }
        return false;
    }
});

我認為這篇文章可能有用,也許您的問題是相同的: 取消取消時,Android AsyncTask不會停止,為什么?

您好,我的辦公桌剛剛離開,筆記本電腦上沒有IDE,因此您只需編寫代碼即可,請嘗試使用Runnable而不是AsyncTask:

    //GLOABLS
boolean threadBool = false;
Handler handler;
    Thread thread;

onCreate(){
    handler = new Handler();


    left.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

                threadBool = true;
                // handler.post(myRunabble);
                                    thread = newThread(myRunnable);
                                    thread.start();
                break;
            case MotionEvent.ACTION_UP:
                threadBool = false;
                break;
            }
            return false;
        }
    });
}

Runnable myRunnable = new Runnable() {
      @Override
      public void run() {
           for(int x = 0; x < MAXX; x++ ){
              handler.post(new Runnable(){
                  public void run() {
                     horizontal.scrollTo(x, 0);
              });
               if (threadBool == false){
                           threadBool = true;
                           break;
                       } 

               try{ Thrad.sleep(100); }catch(Exception e){} //catch the right one here
           }
      }
 };

暫無
暫無

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

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