我正在研究AsyncTask
。
我试图阻止AsyncTask
。
authenticationArrows mTask = new authenticationArrows();
mTask.execute();
我试图通过
来阻止它mTask.cancel(true);
但它并没有停止。
我的AsyncTask
代码如下。
class authenticationArrows extends AsyncTask<Void, Void, Boolean>
{
@Override
protected void onCancelled() {
super.onCancelled();
cancel(true);
// ask if user wants to try again
}
@Override
protected Boolean doInBackground(Void... params) {
return null;
}
protected void onPostExecute() {
}
@Override
protected void onPreExecute() {
if (!isCancelled()){
handler.post(new Runnable() {
@Override
public void run() {
centerImage.setVisibility(View.INVISIBLE);
tiltMotion1.setVisibility(View.VISIBLE);
progressStatus = 60;
mProgressBar.setProgress(progressStatus);
Vibrator v= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(200);
progressStatus += 10;
mProgressBar.setProgress(progressStatus);
}
});
}
if (!isCancelled()){
handler.postDelayed(new Runnable() {
@Override
public void run() {
Motion1.setVisibility(View.INVISIBLE);
Motion2.setVisibility(View.VISIBLE);
Vibrator v= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(200);
progressStatus += 10;
mProgressBar.setProgress(progressStatus);
startHandler();
}
}, 1000);
}
}
public void startHandler(){
if (!isCancelled()){
handler.postDelayed(new Runnable() {
@Override
public void run() {
Motion2.setVisibility(View.INVISIBLE);
Motion3.setVisibility(View.VISIBLE);
Vibrator v= (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(200);
progressStatus += 10;
mProgressBar.setProgress(progressStatus);
}
}, 1000);
}
}
}
如何导航到其他活动或App转到后台时如何停止或取消?
答案 0 :(得分:1)
{1}}方法阻止在doInBackground()完成后调用onPostExecute()。而是将调用onCancelled()。此外,只要您调用cancel(),cancel(...)
将返回true。您应该在doInBackground()中检查这一点,以便尽快完成。
所以,这是无用的代码:
isCancelled()
cancel(true)在这里没有效果,因为只有在之前调用cancel()时才会调用onCancelled()。如果您的AsyncTask将被取消,您可以将其留空或处理此情况。
在这里你应该检查isCancelled():
@Override
protected void onCancelled() {
super.onCancelled();
cancel(true);
}
因为你在这里什么都不做,所以AsyncTask没用,因为你根本就没有背景线程。
这是调用isCancelled()的错误地方:
@Override
protected Boolean doInBackground(Void... params) {
return null;
}
同样,应该在doInBackground()中检查isCancelled()以尽快完成。
要通过切换活动或活动转到后台取消您的任务,请使用@Override
protected void onPreExecute() {
if (!isCancelled()){
...
}
回调并致电onPause()
请仔细阅读有关AsyncTask的文档以获取基础知识。
答案 1 :(得分:0)
事情没有停止的原因是因为进程(doInBackground())一直运行直到它完成。因此,在执行操作之前,您应该检查线程是否被取消:
if(!isCancelled()){
// Do your stuff
}
所以基本上,如果线程没有被取消,那就去做吧,否则跳过它:)在你的操作过程中检查这个问题会很有用,特别是在服用时间之前。
在
中“清理”一点也许有用onCancelled();
以示例:
protected Long doInBackground(URL... urls) {
for (int i = 0; i < count; i++) {
// you need to break your loop on particular condition here
if(isCancelled())
break;
}
return totalSize;
}
希望这有帮助!
答案 2 :(得分:0)
是您的ProgressBar设置为可取消的错误。
在mProgressBar.show()之前添加动作侦听器,如下所示:
mProgressBar.setOnCancelListener(new DialogInterface.OnCancelListener(){
public void onCancel(DialogInterface dialog) {
mTask.cancel(true);
//finish();
}
});