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()

そして getProgoress メソッド

 public int getProgress()
    {
        return (int) ((totaldownload/sizeoffile) * 100);
    }
4

5 に答える 5

8

これは、ProgressBar のバグです。

同じ値が再度渡された場合、はsetProgress(...)更新をトリガーしないようです。drawableただし、 の間もトリガーされませsetMaxん。そのため、更新はありません。

bar.setProgress(0)これを解決するために、私は各更新の前にやっています...これは単なる回避策ですが、期待どおりに機能します:

bar.setProgress(0); // call these two methods before setting progress.
bar.setMax(20);
bar.setProgress(20);

2 番目のオプション。

mSeekBar.post(new Runnable() {
        @Override
        public void run() {
            mSeekBar.setProgress(percentOfFullVolume);
        }
    });

それは誰かのために働くかもしれません。

于 2015-02-10T13:42:18.910 に答える
3

スレッドの run メソッド内でプログレス バーを更新しています。スレッドから ui を更新することはできません。ui スレッドで ui を更新する必要があります。を使用しrunOnUiThreadます。runOnUiThreadアクティビティクラスのメソッドです。

または Asynctask を使用します。

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

asynctask では、1 つまたは複数の進捗単位を発行するためにdoInBackground呼び出すことができます。publishProgress(Progress...)これらの値は、UI スレッドのonProgressUpdate(Progress...)ステップで発行されます。

于 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 を削除できます。代わりに Thread を使用する場合は、AsyncTask が必要なメソッドを既に提供しているのに、それらを記述する必要があるため、java Thread の代わりに AsyncTask を使用してみてください。

于 2013-09-18T07:49:50.303 に答える
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);
}
于 2013-09-18T08:31:05.817 に答える