0

Android 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、それoncreateを使用してresult1に表示できるようにすることTextViewです。ただし、TextViewこの設定では常に空です。だから私は移動します

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

do0()(の直後)に挿入しますresult1 = do2()が、プログラムがクラッシュします。私はこれらのスレッド設定に精通していません、事前にあなたの助けに感謝します。

4

2 に答える 2

2

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

あなたが望むと思うのは、あなたTextViewonPostExecuteメソッドにあなたを設定することですAsyncTaskonPostExecute終了後に呼び出されdoInBackgroundます。

また、これはバックグラウンド スレッドで発生するため、その中のコードから UI doInBackgroundを変更できないことに注意することが重要です。UI スレッドで実行されるため、そこで UI を変更できますが、これらのメソッド内のコードも UI をブロックします。Activity'sonPre/PostExecute

于 2012-04-22T01:49:18.880 に答える
2

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

上記のスニペットはRunnables として実装する必要があります。ネストされた匿名クラスのワンライナーを自由に使用してください。

于 2012-04-22T02:33:00.307 に答える