- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
当我调用 cancel(false)
来停止我的 ASyncTask
时,我发现 onCancelled()
函数甚至在我被调用之前就被调用了能够使用 isCancelled()
检测正在 doInBackground()
中取消的任务。
我试图将取消函数的参数更改为 true,但这也无济于事。
当我阅读文档时,我的理解是我能够在 doInBackground()
中检测到取消,从该函数返回并且仅在 onCancelled()
之后> 函数将代替 onPostExecute()
被调用。
我错过了什么吗?我是否需要添加更多同步机制以确保事情按我期望的顺序发生?
编辑:
下面是代码的组织方式:
AsyncTask<Void,Integer,Void>() {
ProgressDialog mProgressDialog;
@Override
protected Void doInBackground(Void... voids) {
for (int i=0; i<size; i++) {
publishProgress(i/100);
if (isCancelled()) {
Log.d(TAG, "getting out");
return null;
}
// do some database operations here
}
// do some house cleaning work also here
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// create the progress dialog if needed
mProgressDialog = new ProgressDialog(context);
mProgressDialog.setMessage("Do it!");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialogInterface) {
cancel(false);
}
});
mProgressDialog.setCancelable(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.show();
// create some database here
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mProgressDialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
mProgressDialog.dismiss();
}
@Override
protected void onCancelled() {
super.onCancelled();
Log.d(TAG, "Cancelling !");
// since we are cancelling the operation, close and delete the database that was being created
mProgressDialog.dismiss();
}
}
所以现在的问题是,即使在 onCancelled()
中删除了数据库,仍然有一些操作正在对数据库执行。症状是消息的顺序“退出”和“取消!”不一致(我也用调试器做到了,似乎 cancel()
调用直接转到 onCancelled()
而另一个线程仍在运行。
一个可能的原因可能是 this message我刚刚发现……? (我在 Froyo 上运行这个)
更多...
尽管我将 cancel()
调用中的标志设置为 false,但我发现 doInBackground()
函数没有机会完成或检测取消(它甚至永远不会得到返回语句)
最佳答案
所以我发现了一些事情(我想我明白发生了什么)......
我认为 onCancelled
函数会在 doInBackground 返回后被调用而不是 onPostExecute
...相反,onCancelled
被调用调用 AyncTask.cancel() 函数的时间。
所以我遇到的问题是,我的代码会关闭并删除 doInBackground
线程正在处理的数据库。所以大多数时候,该线程只会崩溃(在 logcat 中看不到太多,但大多数时候,它会检查 if (isCancelled())
...
刚刚更改了此任务的组织,现在工作正常。创建一个单独的函数来执行清理,当 isCancelled
返回 true 时,doInBackground
将调用该函数。没有使用 onCancelled
做任何事情......
关于android - mayInterruptIfRunning取消ASyncTask的用法-函数调用顺序-,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8569752/
我今天在我的 Android 项目中遇到了一个涉及 aSyncTasks 的问题,经过一些研究找到了答案,并且与我交谈过的人都没有意识到,所以我想我会与 SO 社区分享,以防万一有人发现它有任何用处。
我目前正在 AsyncTask 的 onPostExecute 方法中执行类似的操作,其中 NewTask 不是当前正在执行的任务: private class OlderTask extends A
所以,我正在研究一个条形码解码器,一旦我们有了条形码,它就会通过互联网进入多个 API 来解码刚刚扫描的内容。问题是我必须将一些 XML 解析链接在一起,我不知道我做的是否正确。 因此,扫描条形码后,
我的团队开发了一个新的 Android 应用程序,它广泛使用了 Room。 我不确定我们是否正确使用 AsyncTask。 我们不得不在 AsyncTasks 中包装所有对 insert/update
我查看了其他问题,但未能澄清我对从另一个任务调用任务的疑问,我有以下代码: protected List doInBackground(String... params) try {
我正在开发一个访问 Web 服务的应用程序,并使用从中获取的 JSON 创建一个对象并在我的代码中使用它。尽管我的应用程序正在运行,但我不知道它是否写得很好且完美无缺。 我将解释我的内容,然后放置一些
虽然我还没有尝试过,但从理论上讲,我问这个问题只是为了消除我的疑虑。 我有这样一个场景:1. 向服务器发送请求并接收 JSON 响应。为此,我正在使用 AsyncTask,因为接收响应可能会有延迟。2
我有以下 AsyncTask 的实现,允许多个 AsyncTask 同时运行: public abstract class MyAsyncTask extends AsyncTask { pu
花了很多时间试图解决这个问题,我已经阅读了很多问题、论坛、答案......但它仍然不会更新 UI。 我的最终目标是从用户那里获取一个搜索词,并将一个 httprequest 发送到用 JSON 回复的
我有一个异步任务 private class LoadData extends AsyncTask { private String WEBURL; LoadData(String u
我正在用 android 做一些编码工作。我几乎遇到了一个问题,为了解决这个问题,我需要一个匿名 AsyncTask 类来执行。但我还需要在执行之前传递并反对这个类。我尝试了下面的代码,但它不起作用,
我有两个 AsyncTask:第一个寻找素数,如果成功,我必须调用第二个 AsyncTask 显示单词“Yop!” (将这个词添加到数组列表中,并显示在AsyncTask三)。 如果我从 onProg
我想使用 AsyncTask 将图像加载到 ListView。 private class LoadImageTask extends AsyncTask,Void,Bitmap>{ @Sup
在我的 AsyncTask 的某个时刻,在完成一些验证之后,我需要派生另一个线程来做一些其他工作。所以我现在想要两个后台线程,每个都做自己的事情(每个执行大约 2-3 秒)。我们的想法是最大限度地提高
(这与空指针无关):我在 AsyncTask 中有一个进度条,并且添加了一个取消按钮来取消 asynctask。 我可以从异步任务外部取消异步任务,但我需要在异步任务下实现的progressdialo
我有一个 Activity ,在启动时调用“json”来获取歌曲的数据类别,之后我调用方法“AsyncTask”来获取来自另一个“JSON”的歌曲列表问题是,当我启动 Activity 时,它被锁定,
我想做以下事情。我想显示一个包含信息和图像的列表。这些图像需要一段时间才能加载,所以我想我会采取不同的方式。我会使用两个 AsyncTasks。第一个创建所有布局并用除图像之外的数据填充它。第二个只是
如果我做了这样的事情: public class MyFragment extends Fragment { private GetDataTask mGDT; //onCreat
在 Android Activity 中,我在 onCreate 方法中执行 AsyncTask。我应该在 AsyncTask 的 onPostExecute 中还是在 OnCreate 方法中声明
我对 AsyncTask 有疑问我尝试为 10 个 Json 文件向互联网打开 10 个请求,因此我读取它并将其保存到用户设备_由于数据差异,此文件必须分开,包括。 那么,将每个请求放在单个 Asyn
我是一名优秀的程序员,十分优秀!