AsyncTask没有调用onProgressUpdate和onPostExecute函数

4

我正在尝试了解在Android上使用AsyncTask,并为此编写了这个简单的代码。

令人惊讶的是,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的截图:

Log


注:LogCat是一种用于查看Android设备日志信息的工具。

1
看一下这个:https://dev59.com/A2w15IYBdhLWcg3wtd4g#6450407 - damian
2个回答

5
方法签名错误,应该像这样:
protected void onPostExecute(Void result) {
    Log.i("Thread","onPosts");
}

此外,我建议您使用@Override注释。这样,如果尝试覆盖错误的方法,则会在编译时出现错误。
编辑:您发布的onProgressUpdate签名有误。应该是:
protected void onProgressUpdate(Integer... progress){}

非常感谢您的回答和建议 :) onPostExecute 现在可以工作了,但是 protected void onProgressUpdate(Void progress) 没有被执行。 - Andoxko
我在你的代码中看不到你调用publishProgress()的地方。 - Blackbelt
我已经编辑了问题。再次感谢您 :) - Andoxko
我已编辑了我的答案。onProgressUpdate的签名是错误的。 - Blackbelt
你是完全正确的!!非常感谢!!(Integer... progress)就是那个东西。 - Andoxko
谢谢,这对我有用。@blackbelt,请问您能否就这个问题http://stackoverflow.com/questions/25598696/recommended-way-order-to-read-data-from-a-webservice-parse-that-data-and-inse给我您的意见? - Axel

1
AsyncTask有一个onProgressUpdate(Void...)方法,您可以在每次迭代或在doInBackground()过程中每次完成进度时通过调用publishProgress()来调用它。
更多细节请参见文档
所以它应该看起来像这样:
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) 没有被执行。至少我没有看到日志。 - Andoxko
这是我的logCat快照http://postimg.org/image/jql10fsgz/,我做错了什么?`onProgressUpdate`是否在另一个线程上打印?我该如何查看它?再次感谢。 - Andoxko
你有这行代码吗 publishProgress(i++); - A.S.
是的,我有它。我已经将你的类复制到我的项目中了。这没有任何意义... - Andoxko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接