[英]Why the AsyncTask doesn't stop?
嗨,謝謝您的關注,
我有以下代碼,
和
但這不會發生...
(當達到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;
}
});
看看文檔
還定義了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);
}
抱歉,我還要說幾件事:
因此通常您的代碼應如下所示:
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.