android – 使用mayInterruptIfRunning取消ASyncTask – 函数调用顺序 –

android – 使用mayInterruptIfRunning取消ASyncTask – 函数调用顺序 –,第1张

概述当我调用cancel(false)来停止我的ASyncTask时,我发现即使在我能够使用isCancelled()在doInBackground()中检测到任务被取消之前,也会调用onCancelled()函数. 我试图将cancel函数的参数更改为true,但这也无济于事. 当我阅读文档时,我的理解是我能够在doInBackground()中检测到取消,从该函数返回并且只有在调用onCancel @H_301_6@ 当我调用cancel(false)来停止我的ASyncTask时,我发现即使在我能够使用isCancelled()在doInBackground()中检测到任务被取消之前,也会调用onCancelled()函数.

我试图将cancel函数的参数更改为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()函数没有机会完成或检测取消(它甚至永远不会返回到return语句)

解决方法 所以我发现了一些事情(我想我明白发生了什么)……

我认为在doInBackground返回之后将调用onCancelled函数而不是onPostExecute …而是在调用AyncTask.cancel()函数时调用onCancelled.

所以我遇到的问题是,使用我的代码,将关闭并删除doInBackground线程正在处理的数据库.所以大部分时间,该线程都会崩溃(在logcat中没有看到太多,但大多数时候,它会检查if(isCancelled())…

刚刚改变了这项任务的组织,现在工作正常.创建一个单独的函数来执行清理,当isCancelled返回true时,doInBackground将调用该函数.没有使用onCancelled任何东西……

总结

以上是内存溢出为你收集整理的android – 使用mayInterruptIfRunning取消ASyncTask – 函数调用顺序 –全部内容,希望文章能够帮你解决android – 使用mayInterruptIfRunning取消ASyncTask – 函数调用顺序 –所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1128482.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存