Android进度条未更新

时间:2013-09-18 07:46:33

标签: android multithreading progressdialog

我在更新进度条时遇到问题。我正在更新单独的线程中的进度条和进度条进度依赖的变量(这是一个类变量)在另一个线程中更新。因此,进度对话框显示但始终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);
    }

5 个答案:

答案 0 :(得分:3)

您正在更新进度条inisde一个线程的run方法。你不能从一个线程更新UI。你需要在ui线程上更新ui。使用runOnUiThreadrunOnUiThread是一种活动类的方法。

或使用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);
}