2012-03-12 37 views
1

我有一個簡單的函數,從0到5000計數,並與這些數字做數學計算,我想顯示進度條顯示它當前的計數位置(每次迭代大致需要1第二)。正在執行功能時刷新屏幕

我的進度如下

<TableRow 
     android:visibility="gone" 
     android:id="@+id/progress_bar_row" > 
     <ProgressBar 
      android:id="@+id/progress_bar" 
      style="?android:attr/progressBarStyleHorizontal" 
      android:layout_width="wrap_content" 
      android:layout_span="2" 
      android:layout_height="wrap_content" /> 
    </TableRow> 

當用戶按下按鈕我的功能啓動時,它使該行可見,我想刷新進度與每個迭代。我的功能如下

private void find_number(View v) 
{ 
    String response = ""; 
    TextView answer = (TextView)findViewById(R.id.answer); 
    TableRow progress_bar_row = (TableRow)findViewById(R.id.progress_bar_row); 
    ProgressBar progress_bar = (ProgressBar)findViewById(R.id.progress_bar); 
    progress_bar.setProgress(0); 
    progress_bar.setMax(5000); 
    progress_bar_row.setVisibility(View.VISIBLE); 

    answer.setText(""); 
    for(int i = 0; i <= 5000; i++) 
    { 
     progress_bar.setProgress(i); 
        // a lot of heavy math is being performed here and answer is stored inside response string 
    } 
    //progress_bar.dismiss(); 
      progress_bar_row.setVisibility(View.GONE); 
    answer.append(response); 
} 

我似乎無法弄清楚刷新屏幕的方法。我探討並得到了一個建議,使用線程和處理程序,我從來沒有使用過線程,也不知道如何改變我的函數以適應線程的使用。或者,如果沒有使用任何線程和簡單的調用某種刷新功能的簡單方法,我也會很感激。任何幫助或指導將非常受歡迎。在此先感謝

回答

2

您應該使用AsyncTask解決此問題。

private class YourTask extends AsyncTask<String, Integer, Long> { 
protected Long doInBackground(String... strings) { 
    for(int i = 0; i <= 5000; i++) 
    {    
     // your code here 
     publishProgress((int) ((i/(float) 5000) * 100)); 
    } 
    return i; 
} 

protected void onProgressUpdate(Integer... progress) { 
    progress_bar.setProgress(progress); 
} 

protected void onPostExecute(Long result) { 
    //Do something after this task finish 
} 

}

+0

確切位置在哪裏我推呢?我是否將其創建爲我的活動中的一個子類,並通過.execute命令執行?我試圖把它放在我的按鈕函數被調用的地方,什麼都沒有發生。 – Quillion 2012-03-12 03:09:11

+0

是的,你創建一個子類,在find_number()函數中,你只能調用(new YourTask())。execute(「test」)。注意,你應該在類中聲明_progress_bar_ param作爲私有參數。 – NamLe 2012-03-12 03:30:12

+0

謝謝,暫時我會用這個,現在開始學習線程。 – Quillion 2012-03-12 03:48:47