2015-11-03 31 views
6

我有这个类从一个片段被调用。进度更新被调用,但消息不会更新。我也没有看到任何进度条或微调。只是标题和消息,看到了一些类似的问题,但没有进展栏根本没有显示。此外,我的消息在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

+0

编辑它以显示我启动它的方式,它只是您开始任务的通用方式,这就是为什么我没有包含它。这些帮助有用? – Zach

回答

3

问题在于您的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(); 
} 

从本质上讲,你需要在调用前戏叫setProgressStyle

此外,您可以删除onProgressUpdate中的runOnUiThread代码,因为onProgressUpdate在UI线程上被调用。

+0

哇的末尾调用'show()',这个简单的问题。非常感谢,当我可以〜22小时左右时奖励赏金 – Zach

+1

很高兴帮助 - 这是一个棘手的错误。如果您有兴趣,请查看ProgressDialog源代码 - 您将看到为什么您遇到此问题。 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ProgressDialog.java#L324 – Aaron

0

不知道确切原因,但它不需要setProgressrunnable as onProgressUpdate将在UI线程上运行。

尝试

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

而且更换

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

- 你在做doInbackground()联网的东西,否则我们看不到,这将在onPostExecute()被解雇的进展。

+0

我之前确实曾经这样做过,但它并没有工作,所以我决定尝试runonuithread。我正在下载图片,因此需要一段时间。对话框显示,但没有进度条,只是标题。一旦它完成下载图像关闭就好了 – Zach

+0

好的。可以尝试初始化进度对话框,然后在'onPreExecute()' – sha