我有一个 Android 应用程序,其类 WifiAudioActivity 扩展了 Activity 类。
简而言之,当按下应用程序上的按钮时,就会运行一个方法,该方法使用进度条来显示该方法的进度。
我显示进度条并使用AsyncTasks更新它。
问题是,为了获取该方法的进度,我让它在另一个线程上运行,因此 AsyncTask 线程上的 while 循环可以不断更新进度值并显示它在进度条中。但是,当我调用progessUpdate()(它更新进度条)时,之后我在运行的线程上设置该方法,它不会更新进度条,它不会更新进度条。甚至不跳转到 onProgressUpdate() 方法代码。
有趣的是,在使用该方法运行线程之前,我可以使用虚拟值更新进度。
我认为这是我的线程的问题 - 有人可以帮忙吗?
private ProgressDialog downloadAllDialog;
private ProgressDialog usingDialog;
private int totalDownloadSize;
private Download downloadAll;
private int totalBlocksLeft;
private boolean downloadComplete;
private boolean downloadFailed;
public void downloadAllClick(View view) //When the download all button is clicked
{
new PerformTask().execute();
}
private class PerformTask extends AsyncTask<Void, Integer, Integer>
{
protected void onPreExecute()
{
showDialog();
}
protected Integer doInBackground(Void... voi)
{
int retryCount = 0;
downloadComplete = false; //Assume the download is not complete
downloadFailed = false;
totalBlocksLeft = 0;
progressUpdater.run(); //Running method thread
publishProgress(20); //THIS DOES NOT WORK
while ((retryCount < Consts.RETRY_TOTAL) && (!(downloadComplete)))
{
int blocksDownloaded = 0;
while ((downloadComplete == false) && (downloadFailed == false))
{
blocksDownloaded = totalDownloadSize - downloadAll.getTotalBlocksLeft(); //GOT FROM THE RUNNING THREAD METHOD
publishProgress(blocksDownloaded); //DOES NOT WORK
}
...
}
return totalBlocksLeft ;
}
Thread progressUpdater = new Thread()
{
@Override
public void run()
{
downloadComplete = downloadAll.downloadAudio(totalBlocksLeft); //Download the audio
if (!(downloadComplete))
{
downloadFailed = true;
}
}
};
protected void onProgressUpdate(Integer... progress)
{
usingDialog.setProgress(progress[0]);
}
protected void onPostExecute(Integer result)
{
removeDialog();
}
}
protected Dialog onCreateDialog()
{
downloadAllDialog = new ProgressDialog(this);
downloadAllDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
downloadAllDialog.setMax(totalDownloadSize);
downloadAllDialog.setProgress(0);
downloadAllDialog.setMessage("Download All");
usingDialog = downloadAllDialog;
return downloadAllDialog;
}
}
就目前而言,在关键代码中:
blocksDownloaded = totalDownloadSize - downloadAll.getTotalBlocksLeft(); //GOT FROM THE RUNNING THREAD METHOD
publishProgress(blocksDownloaded); //DOES NOT WORK
blocksDownloaded从线程运行方法中获取其更新值,随着进度而更新。我确信这在技术上是不正确的,但是在 AsyncTask 中使用线程实际上会运行该方法,同时在主方法中获取进度更新。因此,只有进度条的更新不起作用。
最佳答案
看来您没有正确使用 AsyncTask。您似乎正在 UI 线程上调用下载代码,这可能会阻止进度条更新。
我可以提出以下建议。这将确保您正确使用 AsyncTask。当您正确使用 AsyncTask 时,代码也应该得到很大的简化。
- 不要创建任何线程,也不要使用 runOnUIThread 方法。 AsyncTask 为您提供在适当线程上运行的回调方法。
- 主要下载代码应该在 doInBackground 方法中。
- 您应该在下载代码中的某些地方调用publishProgress。
关于java - 使用 Thread 和 AsyncTask 时 Android 应用程序进度条不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11987713/