我正在我的应用程序的UI部分运行一些任务。
在做这个冗长的任务时,我需要显示进度对话框,所以我使用AsysnTask来执行这个。
当用户按下后退键时,进度条正在运行,我需要取消进度条,我需要暂停正在进行的后台工作。
我在进度对话框中调用了"解散()",所以它被解散了。
我在我的AsysnTask对象上调用"cancel(true)",我认为我的后台操作停止了,但它仍然在执行,尽管我调用了"cancel(true)"。
然后我对这个问题做了一些搜索,并了解到"cancel(true)"只调用AsyncTask的"onCancelled()"方法。
我不知道我必须在我的onCancelled()方法中写什么,以便我的后台操作立即停止。
我的doInBackground()方法是这样的
protected void doInBackground()
{
Statement 1;
Statement 2;
Statement 3;
Statement 4;
Statement 5;
Statement 6;
Statement 6;
Statement 7;
Statement 8;
Statement 9;
}
让我们在上面的代码中说,如果在"语句4"之后收到取消请求,那么我不想执行reaming语句。
上面的"doInBackground()"只是一个例子,使其易于理解,在实际中,我的"doInBackground()"方法将有100的语句,我无法预测何时可以得到取消操作的请求。
请告诉我怎么做。
在java中,线程永远不会过早终止。你可以使用本机API杀死线程,但是Java API不再允许这样做了(即使有一些函数暴露了这个接口,但它们没有实现,只是抛出异常)。
Android也暴露了同样的原理,线程不能被终止。作为开发人员,你有责任以这样的方式编写一个线程,所以当它被取消时,它会正确地反应。在你的情况下,你需要实现doInBackground()
,所以它检查线程是否已经被取消。例如:
protected Void doInBackground()
{
if(isCancelled()) return null;
Statement 1;
Statement 2;
if(isCancelled()) return null;
Statement 3;
if(isCancelled()) return null;
Statement 9;
}
这只是一个例子,你可以做一个更好的实现,在执行下一个垃圾任务之前检查线程状态。
顺便说一下,isCancelled()
是专门为这种用例设计的。从文档:
public final boolean isCancelled ()
返回true,如果此任务在正常完成之前被取消。如果您正在对任务调用cancel(boolean),则返回的值此方法应定期从doInBackground(Object[])来尽快结束任务。
AsyncTasks有两个重要的方法:cancel()
和isCancelled()
。
在doInBackground()
的某个地方,您应该检查isCancelled()
的值,如果它返回true,则完成执行。与正常执行的一个重要区别是,一旦doInBackground()
返回,在UI线程上调用onCancelled()
,而不是onPostExecute()
。
一个例子,文档中简单任务的修改版本:
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count && !isCancelled(); i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
protected void onCancelled(){
showDialog("Operation was cancelled");
}
}
查看官方文档中的"取消任务":http://developer.android.com/reference/android/os/AsyncTask.html
你可以通过这个
检查@Override
protected Void doInBackground(Void... params) {
function1;
function2;
if(!isCancelled() ) {
function3;
function4;
}
return null;
}