我试图将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 – 函数调用顺序 –所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)