gpt4 book ai didi

android - mayInterruptIfRunning取消ASyncTask的用法-函数调用顺序-

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:26 27 4
gpt4 key购买 nike

当我调用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com