Android ProgressBar在加载百分比时如何更改提示信息

4

我想在进度条加载到特定百分比时添加消息。所以当加载了10%时,将出现标题或消息提示有东西被加载。 我无法做到这一点并且它强制关闭。 有什么想法吗。

以下是我的示例代码

  public void onClick(View v) {

        // prepare for a progress bar dialog
        progressBar = new ProgressDialog(v.getContext());
        progressBar.setCancelable(true);
        progressBar.setMessage("File downloading ...");
        progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressBar.setProgress(0);
        progressBar.setMax(100);
        progressBar.show();
        //getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

        //reset progress bar status
        progressBarStatus = 0;
        //reset filesize
        fileSize = 0;

        new Thread(new Runnable() {
          public void run() {
            while (progressBarStatus < 100) {

              // process some tasks
              progressBarStatus = doSomeTasks();

              // your computer is too fast, sleep 1 second
              try {
                Thread.sleep(1000);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }

              // Update the progress bar
              progressBarHandler.post(new Runnable() {
                public void run() {
                  progressBar.setProgress(progressBarStatus);
                }
              });
            }

            // ok, file is downloaded,
            if (progressBarStatus >= 100) {

                // sleep 2 seconds, so that you can see the 100%
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // close the progress bar dialog
                progressBar.dismiss();
            }
          }
           }).start();

           }

            });

    }

// file download simulator... a really simple
public int doSomeTasks() {

    while (fileSize <= 1000000) {

        fileSize++;
        setProgressBarIndeterminate(true);
        if (fileSize == 100000) {
            progressBar.setMessage("10 percent loaded");
            return 10;
        } else if (fileSize == 200000) {
            progressBar.setMessage("20 percent loaded");
            return 20;
        } else if (fileSize == 300000) {
            progressBar.setMessage("30 percent loaded");
            return 30;
        }
        // ...add your own

    }

    return 100;

}

感谢 StackOverFlow 的用户们。

2
你应该真正转向使用AsyncTask,它提供了更好的接口来处理这种问题。 - Egor
2个回答

3
尝试按照以下代码更新进度条...
//To use the AsyncTask, it must be subclassed  
private class LoadViewTask extends AsyncTask<Void, Integer, Void>  
{  
    //Before running code in separate thread  
    @Override  
    protected void onPreExecute()  
    {  
        //Create a new progress dialog  
        progressDialog = new ProgressDialog(LoadingScreenActivity.this);  
        //Set the progress dialog to display a horizontal progress bar  
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
        //Set the dialog title to 'Loading...'  
        progressDialog.setTitle("Loading...");  
        //Set the dialog message to 'Loading application View, please wait...'  
        progressDialog.setMessage("Loading application View, please wait...");  
        //This dialog can't be canceled by pressing the back key  
        progressDialog.setCancelable(false);  
        //This dialog isn't indeterminate  
        progressDialog.setIndeterminate(false);  
        //The maximum number of items is 100  
        progressDialog.setMax(100);  
        //Set the current progress to zero  
        progressDialog.setProgress(0);  
        //Display the progress dialog  
        progressDialog.show();  
    }  

    //The code to be executed in a background thread.  
    @Override  
    protected Void doInBackground(Void... params)  
    {  
        /* This is just a code that delays the thread execution 4 times, 
         * during 850 milliseconds and updates the current progress. This 
         * is where the code that is going to be executed on a background 
         * thread must be placed. 
         */  
        try  
        {  
            //Get the current thread's token  
            synchronized (this)  
            {  
                //Initialize an integer (that will act as a counter) to zero  
                int counter = 0;  
                //While the counter is smaller than four  
                while(counter <= 4)  
                {  
                    //Wait 850 milliseconds  
                    this.wait(850);  
                    //Increment the counter  
                    counter++;  
                    //Set the current progress.  
                    //This value is going to be passed to the onProgressUpdate() method.  
                    publishProgress(counter*25);  
                }  
            }  
        }  
        catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        }  
        return null;  
    }  

    //Update the progress  
    @Override  
    protected void onProgressUpdate(Integer... values)  
    {  
        //set the current progress of the progress dialog  
        progressDialog.setProgress(values[0]);  
    }  

    //after executing the code in the thread  
    @Override  
    protected void onPostExecute(Void result)  
    {  
        //close the progress dialog  
        progressDialog.dismiss();  
        //initialize the View  
        setContentView(R.layout.main);  
    }  
}  

在您想要显示进度条的位置调用此AsyncTask...

//Initialize a LoadViewTask object and call the execute() method  
new LoadViewTask().execute();    

我怎样才能知道我已经加载了10%并且该值对应我期望的值? - Androyds
为了让进度条每增加10%,你需要将while循环修改为while(counter <= 10),并将publishProgress修改为publishProgress(counter*10); - Priyank Patel

2

使用 AsynTask 替代基本线程。在 asynctask 中,使用回调函数 onProgressUpdate 调用 progressBar.setProgress(progressBarStatus);

只能从主线程访问 UI 元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接