13

これが私の状況です:

私の場合、サーバーのデータを取得してに保存するためonCreate()のを作成したいと思います。AsyncTaskArrayList

次に、私のでは、そのデータをに入れたり、設定onCreateView()したりしたいと思います。ListViewonItemClickListener

AsyncTask問題は、とUIスレッドの間に競合を作成していることです。onCreateView()取得が完了する前にが呼び出された場合AsyncTask、アダプタが正しく設定されていない、設定されていないonItemClickListenerなど...

関数AsyncTaskを開始する前に、が実行を終了するのを確実に待つ方法が欲しいのですが。onCreateView()これは可能ですか?get()タスクでの使用について読みましたが、実行に問題がありました。何もしていないようです。

onCreate()(のアダプタを設定するのではonCreateView()なく)でデータを取得してアダプタを設定したい理由は、データを1回取得し、ユーザーが回転した場合にビューを作成できるようにするためです。画面を表示するか、そのに戻ります。onPostExecute()AsyncTaskFragment

4

3 に答える 3

10

これがより良い方法です。を初期化し、ListViewで開始AsyncTaskしますonCreate()。サーバーからデータが利用可能になったら、アダプターに指定されたのと同じ配列にデータを追加し、アダプターを呼び出しnotifyDatasetChanged()ます。これにより、リストビューへの入力が処理されます。ここでは、リストが空の場合に表示されるテキストを追加するためにListFragment呼び出すこともできます。setEmptyText()

于 2013-02-21T01:22:18.667 に答える
1

@sujithの回答に従って実装を変更する必要がありますが、特定の質問に対する回答は次のとおりです。

onCreateView()関数を開始する前に、AsyncTaskの実行が終了するのを確実に待つ方法が必要です。これは可能ですか?

はい、これは可能ですが、タスクの終了を待機している間はUIが表示されなくなります。

を作成して実行し、AsyncTaskそれへの参照を保持します。

MyAsyncTask mTask;

...
...onCreate()
mTask = new MyAsyncTask();
mTask.execute();
...
...onCreateView()
myInfo = mTask.get();
super.onCreateView().

あなたの場合、これは悪い考えですが、このようなことをする必要がある場合があります。

編集:mTask.get()によって返されるものは何でも返しますdoInBackground()

于 2013-02-21T01:44:51.667 に答える
0

何をしていてもonCreateView()、に移動しますonViewCreated()

onViewCreatedビューの準備ができた後に呼び出されるので、問題は発生しません

于 2013-02-21T00:58:25.840 に答える