2013-11-27 73 views
-1

你好,感謝您的關注,爲什麼AsyncTask不停止?

我有下面的代碼,這

  • 啓動時按下按鈕,

  • 應停止的的AsyncTask AsyncTask當按鈕被釋放時。

但這種情況不會發生......

(中的AsyncTask繼續進行,直到它自然結束,達到MAXX值時)

請我究竟做錯了什麼?

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; 
     } 
    }); 
+0

如果你讀了'cancel'的文件,你會看到,你希望它是什麼沒有做。 (順便說一下,我沒有看到if條件的要點。) – njzk2

回答

1

嗨,剛剛離開我的辦公桌,而我沒有我的IDE筆記本電腦所以只是寫代碼了心思,儘量使用代替的AsyncTask一個Runnable:

//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 
      } 
     } 
}; 
+0

如果你想只想要在列表視圖中滾動,你還應該檢查'smoothScrollTo' –

+0

它太快....並且如果我使用SystemClock.sleep(10);它只是凍結... –

+0

因此創建一個線程並從該線程可運行 –

2

看一看在Documentation

它還定義的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. 你爲什麼不使用for循環當u要增加x
  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; 
    } 
}); 
+0

謝謝A.S.但doInBackground即使在您修改後也不會停止! –

+0

再次感謝A.S.但仍然不會停止...: - ((( –

+0

所以嘗試採取thrad/runnable –