Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTask从不在PostExecute上执行_Android_Android Asynctask - Fatal编程技术网

Android AsyncTask从不在PostExecute上执行

Android AsyncTask从不在PostExecute上执行,android,android-asynctask,Android,Android Asynctask,我正在尝试执行以下异步任务: private class TimeUpdateTask extends AsyncTask<List<mObject>, Integer, Void> { @Override protected Void doInBackground(List<mObject>... params) { mObject o; int i;

我正在尝试执行以下异步任务:

private class TimeUpdateTask extends AsyncTask<List<mObject>, Integer, Void> {

        @Override
        protected Void doInBackground(List<mObject>... params) {
            mObject o;
            int i;
            int numChecked = 0;

            List<mObject> mObjects = params[0];
            while(true)
            {   
                if (isCancelled())
                {
                    Log.w("TAG", "task interrumped");
                    return null;
                }

                    for (i=0 ; i < mObjects.size() ; i++)
                    {
                        o = mObjects.get(i);
                        if (!o.isChecked())
                        {
                            o.calculateProgress();
                            if (o.isChecked())
                            {
                                numChecked++;
                            }
                        }
                    }
                publishProgress(numChecked);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }

            }
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void onProgressUpdate(Integer... param){
            int progressCompleted = param[0];

            ((ArrayAdapter<mObject>) EventListView.this.EventView.getAdapter()).notifyDataSetChanged();

            mMain.setProgressBarCompleted(progressCompleted);
        }

        /*This should execute*/
        @Override
        protected void onPostExecute(Void result) {
            Log.d("TAG","End onPostExecute");
         }

    }
私有类TimeUpdateTask扩展异步任务{
@凌驾
受保护的Void doInBackground(列表…参数){
蒙博托;
int i;
int numChecked=0;
List mObjects=params[0];
while(true)
{   
如果(isCancelled())
{
Log.w(“标记”,“任务被中断”);
返回null;
}
对于(i=0;i
因此,当我在此任务上调用
cancel(false)
时,应该执行
onPostExecute
,但它永远不会执行

代码中有什么问题吗?
我在SO中查看了很多答案,似乎有#5
AsyncTask
在周围徘徊是正常的,即使您目前只使用一个(如我的情况)也是如此。

这里缺少一个大片段,您必须了解

从开发人员文档(请参见下面的粗体文本):)

试图取消此任务的执行。如果 任务已完成、已取消或无法执行 由于其他原因被取消。如果成功,此任务已完成 调用cancel时未启动,此任务不应运行。如果 任务已启动,则MayInterruptFrunning参数 确定执行此任务的线程是否应 在试图停止任务时被中断

调用此方法将导致调用onCancelled(对象) 在doInBackground(对象[])返回后的UI线程上呼叫 此方法保证永远不会调用onPostExecute(对象)。 调用此方法后,应检查 定期从doInBackground(对象[])执行isCancelled()以完成 尽早完成任务


我认为调用cancel实际上会取消执行过程中的所有操作,包括onPostExecute。您应该使用自己的局部布尔变量并执行以下操作:

private boolean shouldContinue = true;

public void customCancel() 
{
       shouldContinue = false;
}
然后在循环中执行以下操作:

if (!shouldContinue)
{
    Log.w("TAG", "task interrumped");
    return null;
}

Android使用onCancelled()当任务被取消时,它不会调用onPostExecute

感谢您指出这一点。现在一切都变得更有意义了:)“调用此方法可确保永远不会调用onPostExecute(对象)。-这就是为什么OP从未看到调用
onPostExecute(…)
方法的原因+1令人担忧的是,这毫无意义-当
onCancelled()
被调用时,
doInBackground(…)
方法将已经终止,并且
应该继续
在“循环”中没有相关性。除其他注释/答案外,不要使用
while(true)
。在(!isCancelled())
时尝试
-这样更有意义。谢谢,我也这么想:)