我在更新进度条时遇到问题。我正在更新单独的线程中的进度条和进度条进度依赖的变量(这是一个类变量)在另一个线程中更新。因此,进度对话框显示但始终0%不更新进度。请帮帮我。
public void setProgressbar()
{
progressBar = new ProgressDialog(context);
progressBar.setCancelable(true);
progressBar.setMessage("File downloading ...");
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressBar.setProgress(0);
progressBar.setMax(100);
progressBar.show();
Thread thread = new Thread()
{
public void run()
{
while(progressBar.getProgress() < 100)
{
Log.v("progressbar", getProgress()+"");
progressBar.setProgress(getProgress());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
thread.start();
更新价值代码
Thread thread = new Thread()
{
public void run()
{
.
.
.
while((bytesRead = is.read(bytearray, 0, bytearray.length)) != -1)
{
bos.write(bytearray, 0, bytesRead);
totaldownload = totaldownload + bytesRead;
Log.v("downloadign ", totaldownload+"");
// progressBar.setProgress((int) ((totaldownload/sizeoffile) * 100));
}
bos.close();
.
.
.
};
thread.start()
getPrgoress方法
public int getProgress()
{
return (int) ((totaldownload/sizeoffile) * 100);
}
答案 0 :(得分:3)
您正在更新进度条inisde一个线程的run方法。你不能从一个线程更新UI。你需要在ui线程上更新ui。使用runOnUiThread
。 runOnUiThread
是一种活动类的方法。
或使用Asynctask。
http://developer.android.com/reference/android/os/AsyncTask.html
在asynctask doInBackground
中,您可以调用publishProgress(Progress...)
来发布一个或多个进度单元。这些值发布在UI线程的onProgressUpdate(Progress...)
步骤中。
答案 1 :(得分:3)
这是ProgressBar中的Bug!
如果再次传递相同的值,则setProgress(...)
似乎不会触发drawable
上的更新。但它也没有在setMax
期间触发。所以缺少更新。
要解决此问题,我在每次更新之前只做一个bar.setProgress(0)
...这只是一种解决方法,但它对我有效:
bar.setProgress(0); // call these two methods before setting progress.
bar.setMax(20);
bar.setProgress(20);
第二个选项。
mSeekBar.post(new Runnable() {
@Override
public void run() {
mSeekBar.setProgress(percentOfFullVolume);
}
});
它也适用于某人。
答案 2 :(得分:1)
使用AsyncTask,本文档中还有一个示例可以满足您的需求。
AsyncTask的这段代码实际上就是你想要完成的。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
您只需要将setProgressPercent()更改为进度条值更改的方法名称。如果您不需要,可以删除onPostExecute方法AFAIK。尝试使用AsyncTask而不是java Thread,因为AsyncTask提供了已经满足需要的方法,而如果你使用Thread则需要编写它们。
答案 3 :(得分:1)
你的逻辑有问题。将您的主题更改为以下
Thread thread = new Thread()
{
public void run()
{
int prog = 0;
while(prog < 100)
{
progressBar.setProgress(prog);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
prog ++;
}
}
};
thread.start();
答案 4 :(得分:0)
试试这个。
在Global。声明此变量。
int delay = 100;
int period = 2000;
在您需要的地方进行函数调用。
public void setProgressbar()
{
progressBar = new ProgressDialog(context);
progressBar.setCancelable(true);
progressBar.setMessage("File downloading ...");
progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressBar.setProgress(0);
progressBar.setMax(100);
progressBar.show();
final Handler mhandler = new Handler();
final Runnable mRunnable = new Runnable() {
@Override
public void run() {
progressBar.setProgress(progress);
progress++;
}
};
final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
mhandler.post(mRunnable);
}
}, delay, period);
}