【问题标题】:AsyncTask not calling onProgressUpdate,onPostExecuteAsyncTask 未调用 onProgressUpdate、onPostExecute
【发布时间】:2013-12-18 12:02:14
【问题描述】:

我试图了解 AsyncTask 在 Android 上的使用,为此我开发了这个简单的代码。

令人惊讶的是,doInbackground 被正确调用了,我看到了日志,但没有调用其他两种方法。

我错过了什么吗?

  public class DownloadFilesTask extends AsyncTask<Void, Void, Void> {

        protected Void doInBackground(Void... params) {
            try {
                Log.i("Thread","1");
                Thread.sleep(1000);
                Log.i("Thread","2");
                Thread.sleep(1000);
                Log.i("Thread","3");
                Thread.sleep(1000);
                Log.i("Thread","4");
                Thread.sleep(1000);
                Log.i("Thread","5");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        protected void onProgressUpdate(Void... progress) {
            Log.i("Thread","onProgress");
        }

        protected void onPostExecute(Void... result) {
            Log.i("Thread","onPosts");
        }
    }

[编辑]

除了onProgressUpdate之外,这段代码一切正常

public class DownloadFilesTask extends AsyncTask<Void, Integer, String> {

public String doInBackground(Void... params) {
    try {
        int i = 0;
        Log.i("Thread","1");
        Thread.sleep(1000);
        publishProgress(i++);
        Log.i("Thread","2");
        Thread.sleep(1000);
        publishProgress(i++);
        Log.i("Thread","3");
        Thread.sleep(1000);
        Log.i("Thread","4");
        Thread.sleep(1000);
        Log.i("Thread","5");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "done";
}

public void onProgressUpdate(int progress) {
    Log.i("Thread","onProgress " + progress);
}

public void onPostExecute(String result) {
    Log.i("Thread","onPosts " + result);
}

在这里你可以看到我的 LogCat 的截图:

【问题讨论】:

标签: android android-asynctask


【解决方案1】:

方法签名错误。它应该看起来像:

protected void onPostExecute(Void result) {
    Log.i("Thread","onPosts");
}

另外,我建议您使用@Override 注释。这样,如果您尝试覆盖错误的方法,您将收到编译时错误。

编辑: 您发布的 onProgressUpdate 的签名是错误的。应该是:

protected void onProgressUpdate(Integer... progress){}

【讨论】:

  • 非常感谢您的回答和建议 :) onPostExecute 现在正在工作,但 protected void onProgressUpdate(Void progress) 没有被执行..
  • 我在你的代码中看不到你调用 publishProgress();
  • 我已经编辑了这个问题。再次感谢你:)
  • 我已经编辑了我的答案。 onProgressUpdate 的签名错误
  • 你完全正确!!非常感谢!! (Integer... progress) 是事情
【解决方案2】:

AsyncTask 具有 onProgressUpdate(Void...) 方法,例如,您可以调用每次迭代或每次在 doInBackground() 期间通过调用 publishProgress() 完成进度时。

更多详情请参考docs

所以它应该看起来像这样:

public class DownloadFilesTask extends AsyncTask<Void, Integer, String> {

    protected String doInBackground(Void... params) {
        try {
            int i = 0;
            Log.i("Thread","1");
            Thread.sleep(1000);
            publishProgress(i++);
            Log.i("Thread","2");
            Thread.sleep(1000);
            publishProgress(i++);
            Log.i("Thread","3");
            Thread.sleep(1000);
            Log.i("Thread","4");
            Thread.sleep(1000);
            Log.i("Thread","5");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "done";
    }

    protected void onProgressUpdate(int progress) {
        Log.i("Thread","onProgress " + progress);
    }

    private void onPostExecute(String result) {
        Log.i("Thread","onPosts " + result);
    }
}

【讨论】:

  • 非常感谢您的回答和示例,您的代码工作正常,但 protected void onProgressUpdate(int progress) 没有被执行。至少我没有看到日志。。
  • 这是我的 logCat postimg.org/image/jql10fsgz 的快照我做错了什么? onProgressUpdate 打印在另一个线程上吗?我怎么看?再次感谢您
  • 你有这行`publishProgress(i++);`
  • 是的,我有。我已将您的课程复制到我的项目中。这没有任何意义......
猜你喜欢
  • 2018-05-24
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多