0

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

5 回答 5

8

这是进度条中的错误!

如果再次传递相同的值,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);
        }
    });

它也可能对某人有用。

于 2015-02-10T13:42:18.910 回答
3

您正在更新线程的运行方法中的进度条。您无法从线程更新 ui。您需要在 ui 线程上更新 ui。使用runOnUiThread. runOnUiThread是活动类的方法。

或者使用异步任务。

http://developer.android.com/reference/android/os/AsyncTask.html

在 asynctask 中doInBackground,您可以调用publishProgress(Progress...)以发布一个或多个进度单位。这些值在onProgressUpdate(Progress...)步骤中的 UI 线程上发布。

于 2013-09-18T07:49:04.770 回答
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 代替,则需要编写它们。

于 2013-09-18T07:49:50.303 回答
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();
于 2013-09-18T08:04:05.287 回答
0

尝试这个。

在全局声明这个变量。

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);
}
于 2013-09-18T08:31:05.817 回答