2012-04-22 15 views
0

Android AsyncTaskで作業しています。プログラムのロード中にプログレスバーを作成したいと考えています。ここで私はそれを作る方法です。AsyncTaskで生成されたデータを保持する方法は?

A class is declared here... 
private ArrayList<String> result1 = new ArrayList<String>(); //class variable 

onCreate() 
{ 
    Some stuff here... 
    new ATask().execute(); 
    for (int i = 0; i <result1.size();i++) 
    { 
     output = output +result1.get(i) + "\n\n"; 
    } 
    textView.setText(output); 
} 
private void do0() 
{ 
    ArrayList<Sentence> result = new ArrayList<Sentence>(); 
    ArrayList<String> result2 = new ArrayList<String>(); 
    result = do1("link", true); //just some function I am working 
    result1 = do2(result,10);//do2 return ArrayList<String> 
} 
private class ATask extends AsyncTask<String, Void, String>{ 
    private ProgressDialog progress = null; 
    @Override 
    protected String doInBackground(String... params) { 
     do0(); 
     return null; 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     progress.dismiss(); 

     //adapter.notifyDataSetChanged(); 

     super.onPostExecute(result); 
    } 

    @Override 
    protected void onPreExecute() { 
     progress = new ProgressDialog(ReadWebPage.this); 

     progress.setMessage("Doing..."); 
     progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progress.show(); 

     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 
}; 

私の意図は、プログレスバーが読み込まれている間、それはdo0()を終了し、result1を変更し、その後、私のoncreateresult1がそれに表示することTextViewだと使用することができます、ということです。ただし、この設定では私のTextViewは常に空です。だから私はdo0()(右後result1 = do2())に

 for (int i = 0; i <result1.size();i++) 
    { 
     output = output +result1.get(i) + "\n\n"; 
    } 
    textView.setText(output); 

を移動するが、その後、プログラムがクラッシュします。私はこれらのスレッドの設定に精通していない、事前にあなたの助けをありがとう。

答えて

2

メインスレッドで初期化されたHandlerオブジェクトを保持しているスレッドを使用する方がよいでしょう。ハンドラを使用すると、post()メインスレッド上で実行される小さなスニペット(プログレスバーの更新など)を行うことができます。 AsyncTaskから同じHandlerトリックを実行できますが、IMHOスレッドはよりクリーンです。

このスニペットは、Runnableとして実装する必要があります。ネストされた匿名クラスのone-linerを自由に使用してください。

+0

ありがとう、これは、コードのより良い使い方が、私はサンプルコードから使用する1つを取得します。私はこれにはあまり慣れていませんが、より成熟したコーディング能力が得られたら、あなたのアプローチはすべきだと思います。あなたのお勧めをありがとう。 – JLTChiu

2

問題は、コードの設計にあります。 AsyncTaskは非同期的に発生します。したがって、AsyncTaskの実行を呼び出すと、ただちにonCreateの残りの部分が実行されます。 AsyncTaskは基本的に新しいスレッドで実行され、Activityと並行して実行されます。

AsyncTaskonPostExecuteメソッドにTextViewを設定することをお勧めします。 doInBackgroundの後にonPostExecuteが呼び出されます。

また、doInBackgroundはバックグラウンドスレッドで発生するため、その中のコードからActivity'sのUIを変更することはできません。 onPre/PostExecuteがUIスレッドで実行されるため、そこでUIを変更できますが、これらのメソッド内のコードでもUIはブロックされます。

+0

ありがとうございます。 'activities'と' onPre/PostExecute'コマンドの使い方を明確にしてくれてありがとうございます。私はインターネット上のサンプルコードからこれを得ているので、あまりよく知られていません。私はあなたの助けに非常に感謝します。 – JLTChiu

関連する問題