Android 为什么异步任务不停止?
嗨,谢谢你的关注 我有下面的代码,它 按下按钮时启动异步任务 及 应在释放按钮时停止AsyncTask。 但这不会发生 AsyncTask一直持续到其自然结束,即达到MAXX值 请问我做错了什么Android 为什么异步任务不停止?,android,Android,嗨,谢谢你的关注 我有下面的代码,它 按下按钮时启动异步任务 及 应在释放按钮时停止AsyncTask。 但这不会发生 AsyncTask一直持续到其自然结束,即达到MAXX值 请问我做错了什么 将此添加到while循环: if (isCancelled()) break; 更多信息:查看 还定义了不会取消doInBackGround。因此,您应该检查循环中的线程是否被取消,并按照文档中的示例所述中断/保留它 所以你的代码应该像这样 @Override prot
将此添加到while循环:
if (isCancelled()) break;
更多信息:查看
还定义了不会取消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);
}
对不起,我还要说几句话:
类的名称应以大写字母开头。
当你想增加x时,为什么不使用for循环呢
变量应以小写字母开头
因此,通常您的代码应该如下所示:
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;
}
});
我认为这篇文章可能有用,也许你的问题是一样的:
您好,我的办公桌刚刚离开,我的笔记本电脑上没有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
}
}
};
如果您阅读了cancel的文档,您会发现它并没有达到您想要的效果。顺便说一句,我看不出if条件的意义。所以试着用thrad/runnableOH该死的去吧!你在每个TouchEvent都创建一个新的Asymnctask这是我考虑过的,让我检查一下,请为正确的AsyncTask定义一个全局变量,并在onCreate中对其进行初始化,或者像我更新的回答那样进行初始化。如果您只想在列表视图中滚动,您还应该检查SmoothScroll以查看以下内容:您可以编辑我的回答吗
//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
}
}
};