2012-09-19 63 views
4

我試圖在進度條加載到特定百分比時添加消息。所以當10%被加載時,一個標題或一條消息顯示某個東西被加載。 我不能這樣做,它迫使關閉。 任何想法如何做到這一點。加載百分比時發生Android ProgressBar消息更改

下面是我的示例代碼

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; 

} 

感謝計算器用戶

+1

你真的應該切換到使用的AsyncTask,它爲處理這類問題提供了一個更好的界面。 – Egor

回答

2

嘗試更新進度條類似下面的代碼...

//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();  
+0

我怎麼知道我是否已經裝載了10%,並且該值對應於我預期的 – Androyds

+0

10%...您必須改變while while(counter <= 10)'並更改publishProgress like'publishProgress(counter * 10);' –

2

使用AsynTask,而不是基本的線程。在asynctask中,使用回調onProgressUpdate來呼叫progressBar.setProgress(progressBarStatus);

您只能從主線程訪問UI元素。