进度对话框出现但没有进度条显示且消息没有更新。

8
我有一个被fragment调用的类。在进度更新时,消息不会更新。我也没有看到任何进度条或旋转器,只有标题和消息。看到了一些类似的问题,但没有一个进度条完全没有显示的情况。此外,在onProgressUpdate中我的消息根本没有更新,但打印出的值表明它在onProgressUpdate内部递增。
编辑:这是我如何启动任务
DownloadFilesTask download = new DownloadFilesTask();
download.execute(urls.toArray(new String[urls.size()]));

这里是类

private class DownloadFilesTask extends AsyncTask<String, Integer, Long> {

ProgressDialog progressDialog;

@Override
protected void onPreExecute()
{
    progressDialog = ProgressDialog.show(getActivity(), "Downloading","Downloaded 0/"+urls.size(), false);
    progressDialog.setProgress(0);
    progressDialog.setMax(urls.size());
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
}

@Override
protected Long doInBackground(String[] urls) {
    int count = urls.length;
    long totalSize = 0;
    for (int i = 0; i < count; i++) {
            //Do things in background here
            publishProgress(new Integer[] {i});
    }
    return totalSize;
}

@Override
protected void onProgressUpdate(final Integer... progress) {
    System.out.println(progress[0]); //This does print correctly
    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            progressDialog.setProgress(progress[0]);
            progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size());
        }
    });
}

@Override
protected void onPostExecute(Long result) {
    progressDialog.dismiss();
    Toast t = Toast.makeText(getActivity(), "Downloaded", Toast.LENGTH_LONG);
    t.show();
}

}


1
你是如何开始这个任务的,请展示一下代码。 - starkshang
编辑后的内容展示了我开始任务的方式,这只是一种通用的方式,所以我没有包含它。这有帮助吗? - Zach
2个回答

5
问题出在ProgressDialog的初始化方法上。
请使用以下代码替换你的onPreExecute方法:
@Override
protected void onPreExecute() {
    progressDialog = new ProgressDialog(activity);
    progressDialog.setTitle("Downloading");
    progressDialog.setMessage("Downloaded 0/" + urls.size());
    progressDialog.setIndeterminate(false);
    progressDialog.setProgress(0);
    progressDialog.setMax(urls.size());
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.show();
}

基本上,在调用 show 方法之前,您需要调用 setProgressStyle 方法。
另外,您可以移除 onProgressUpdate 中的 runOnUiThread 代码,因为 onProgressUpdate 已经在 UI 线程中被调用。

哇,这个问题好简单。非常感谢,我会在能颁发奖励的时候将其授予 ~还剩22小时。 - Zach
1
很高兴能帮忙 - 这是一个棘手的 bug。如果你感兴趣,可以看一下 ProgressDialog 的源代码 - 你会明白为什么会遇到这个问题。https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ProgressDialog.java#L324 - Aaron

0

不确定确切的原因,但在runnable上不需要setProgress,因为onProgressUpdate将在UI线程上运行。

尝试替换

getActivity().runOnUiThread(new Runnable() { @Override public void run() { progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size()); } });

使用

progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size());

此外 - 如果您没有在doInBackground()中执行网络操作,则无法看到进度,该进度将在onPostExecute()中被解除。


我之前尝试过这个方法,但是它并没有起作用,所以我决定尝试runonuithread。我正在下载图片,所以需要一些时间。对话框会显示出来,但里面没有进度条,只有标题。一旦图片下载完成,对话框就可以正常关闭了。 - Zach
好的。也许先尝试初始化进度对话框,然后在onPreExecute()的结尾调用show() - sha

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