Android 如何在AsyncTask中处理isCancelled
我正在尝试将此代码添加到我的Android 如何在AsyncTask中处理isCancelled,android,android-asynctask,Android,Android Asynctask,我正在尝试将此代码添加到我的doInBackGround,以便在用户按下后退按钮时捕获正在设置的标志 protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.download
doInBackGround
,以便在用户按下后退按钮时捕获正在设置的标志
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
当我试图将isCancelled
转换为异步任务时,问题就出现了。我在Downloader
下得到一个错误,上面写着“Downloader
无法解决”我在publishProgress
下也得到一个错误,上面写着“类型AsyncTask中的方法publishProgress
(字符串…)不适用于参数(int)”我的任务是有人可以帮我把isCancelled
放到我的任务中。我也做了研究,发现在代码中使用isCancelled
的方法不止一种。我已经意识到,处理已取消
对于新手来说确实是一件麻烦事。1)要解决错误,请将Downloader设置为该类的公共静态数据变量。
2) 请确保
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
私有类下载文件任务扩展异步任务
是类声明吗
调用cancel()后,isCancelled()将返回true,而在执行doInBackground后,返回onCancelled,而不是onPostExecute。该参数将在后台线程上发出中断,因此您的长时间操作将关闭。不过,我想你可能在什么地方发现了这个问题。
希望这有帮助。。
如果无法解决错误,请发布日志猫详细信息
从SDK:
取消任务
可以通过调用cancel(布尔值)随时取消任务。
调用此方法将导致对isCancelled()的后续调用
返回true。调用此方法后,改为OnCancell(对象)
onPostExecute(对象)的
doInBackground(对象[])返回。确保任务已取消
您应该尽可能快地检查
如果可能,从doInBackground(对象[])定期执行isCancelled()
(例如,在循环内部。)
另外,请在函数块的开头使用super.onpause()等
请参阅:-1)要解决错误,请将Downloader设置为该类的公共静态数据变量。
2) 请确保
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
私有类下载文件任务扩展异步任务
是类声明吗
调用cancel()后,isCancelled()将返回true,而在执行doInBackground后,返回onCancelled,而不是onPostExecute。该参数将在后台线程上发出中断,因此您的长时间操作将关闭。不过,我想你可能在什么地方发现了这个问题。
希望这有帮助。。
如果无法解决错误,请发布日志猫详细信息
从SDK:
取消任务
可以通过调用cancel(布尔值)随时取消任务。
调用此方法将导致对isCancelled()的后续调用
返回true。调用此方法后,改为OnCancell(对象)
onPostExecute(对象)的
doInBackground(对象[])返回。确保任务已取消
您应该尽可能快地检查
如果可能,从doInBackground(对象[])定期执行isCancelled()
(例如,在循环内部。)
另外,请在函数块的开头使用super.onpause()等
请参阅:-在这种情况下,您需要为Asynctask类编写一个单独的文件。还要进行接口回调 您不需要跳过onBackPress按钮,只需将progressDialog设置为cancelable(True)并设置onCancelListner()。在这里,您可以设置一个标志isCanceld=true 整个场景在这个链接中定义 查看德米特里·扎伊采夫的答案,试试这个,如果卡在任何地方,请告诉我
希望这对您有所帮助。在这种情况下,您需要为Asynctask类编写一个单独的文件。还要进行接口回调 您不需要跳过onBackPress按钮,只需将progressDialog设置为cancelable(True)并设置onCancelListner()。在这里,您可以设置一个标志isCanceld=true 整个场景在这个链接中定义 查看德米特里·扎伊采夫的答案,试试这个,如果卡在任何地方,请告诉我
希望这有帮助这是
中止
一个合理的方法,因为我的一些朋友向我建议了这个方法,而且在我调用它之后,我需要用异常捕获它
查看我的更新答案..'pDialog.setOnCancelListener(新建DialogInterface.OnCancelListener(){public void onCancel(DialogInterface dialog){myTask.cancel(true);//finish();}});'好的,所以我把pDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){public void onCancel(DialogInterface dialog){myTask.cancel(true);//finish();}})代码>在我的doInBackGround
方法下,你可以在onPreExecute函数上定义一个对话,并使用上面的代码..当对话被取消时,任务也会被取消,我还需要一个异常
以便在异步任务被取消时使用,对吗?因为我的一些朋友建议,在这里使用中止
是合理的方法吗这对我来说很重要,而且在我调用它之后,我需要用一个异常捕获它
查看我的更新答案..”pDialog.setOnCancelListener(新建DialogInterface.OnCancelListener(){public void onCancel(DialogInterface dialog){myTask.cancel(true);//finish();}});'好的,所以我把pDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){public void onCancel(DialogInterface dialog){myTask.cancel(true);//finish();}})代码>在mydoInBackGround
Methody下定义onPreExecute函数上的对话,并使用上述代码..当对话被取消时