2012-03-12 6 views
1

私は、0から5000まで数えて、それらの数値でファンキーな数学を行い、現在カウントしている場所を示すプログレスバーを表示したいと思います秒)。関数が実行されている間に画面を更新する

私のプログレスバーは、次の

<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

+0

はい、サブクラスを作成し、find_number()関数では、(新しいYourTask())。execute( "test")だけを呼び出します。 _progress_bar_ paramをクラスのプライベートparamとして宣言する必要があることに注意してください。 – NamLe

+0

当分の間、私はこれを使用し、今スレッドの学習を開始します。 – Quillion

関連する問題