0

次のコードがあります。

public class SomeActivity extends Activity {
    Context context;
    List<MenuItem> menuItems;

    public void importList(View v) {
        menuItems = new ArrayList<MenuItem>();
        ProgressDialog dialog = ProgressDialog.show(this.context, "TITLE", "MSG");

        MyAsyncTask task = new MyAsyncTask(context); // Context is here because I tried to create ProgressDialog inside pre/postExecute, but it doesn't work either
        task.execute();
        try {
            // menuItems = task.get();
        } catch(Exception e) {
            // : (
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        this.context = this;
    }
}

AsyncTask ("menuItems = task.get()") から値を取得する行にコメントを付けると、すべて正常に機能します。しかし、コメントを外すと、タスクが終了した後に ProgressDialog が表示され、値が返されます。何故ですか?

これらのコンテキストと関係があると思います(そのため、 onCreate メソッドを含めました)が、修正方法がわかりません。明らかに、タスクが終了した後ではなく、終了する前に ProgressDialog を表示したいのです。

関連するかどうか不明 - MyAsyncTask は http リクエストといくつかの json 解析を行っています。

4

1 に答える 1

2

これらの文脈と関係があると思います

全くない。また、 から送信ContextするActivity場合、変数を作成する必要はありません。thisまたはを使用するだけActivityName.thisです。

 MyAsyncTask task = new MyAsyncTask(this);

しかし、コメントを外すと、タスクが終了した後に ProgressDialog が表示され、値が返されます。何故ですか?

を呼び出すと がget()ブロックUIされます。これが、完了するまで進行状況が表示されない理由です。これを呼び出す必要はありません。のポイントonProgressUpdate()は、バックグラウンド スレッド ( ) がそれを呼び出してdoInBackground()を更新できるようにすることです。UIdoInBackground()UI

コードからその行を削除し、二度と見ないでください。必要だと思われる理由がある場合は、説明してください。より良い方法を見つけるお手伝いをいたします。

編集

タスクが終了したときの更新に関するこのSOの回答を参照してください

于 2013-09-04T20:37:14.983 に答える