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 用户

4

2 回答 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();    
于 2012-09-19T08:34:55.107 回答
2

使用AsynTask而不是基本线程。在 asynctask 中,使用回调onProgressUpdate调用 progressBar.setProgress(progressBarStatus);

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

于 2012-09-19T08:29:58.320 回答