7

ネットワークからのデータを長い時間入力する必要がありListViewます。たとえば、データ コレクション全体で 2 ~ 3 秒かかります。ユーザーがロードを見て、Dialogリスト全体のダウンロードを待つ必要はありません。ListView代わりに、各アイテムが利用可能になるたび に更新したいと考えています。

  • これどうやってするの?
  • ArrayAdapterfrom にAsyncTaskwith を追加することで推測しOnProgressUpdateます。
  • notifyDatasetChanged()行を追加するたびに を発行する必要がありますか?
  • Fragment/Loaderアプローチの方が優れていますか?
  • このような場合のチュートリアルまたは API デモ リファレンス実装はありますか?

Activity死ぬ前にデータが完全にフェッチされることは重要ではありません(つまりService、不要です) 。

4

3 に答える 3

3

私がこれまでに見た中で最良のアプローチはCommonsWare によるものです。この関連する回答で見つかりました。

addどうやらなしで呼び出しても問題はないようnotifyDatasetChanged()です。

public class AsyncDemo extends ListActivity {
  private static final String[] items={"lorem", "ipsum", "dolor",
                                      "sit", "amet", "consectetuer",
                                      "adipiscing", "elit", "morbi",
                                      "vel", "ligula", "vitae",
                                      "arcu", "aliquet", "mollis",
                                      "etiam", "vel", "erat",
                                      "placerat", "ante",
                                      "porttitor", "sodales",
                                      "pellentesque", "augue",
                                      "purus"};
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    setListAdapter(new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_1,
                        new ArrayList<String>()));

    new AddStringTask().execute();
  }

  class AddStringTask extends AsyncTask<Void, String, Void> {
    @Override
    protected Void doInBackground(Void... unused) {
      for (String item : items) {
        publishProgress(item);
        SystemClock.sleep(200);
      }

      return(null);
    }

    @Override
    protected void onProgressUpdate(String... item) {
      ((ArrayAdapter<String>)getListAdapter()).add(item[0]);
    }

    @Override
    protected void onPostExecute(Void unused) {
      Toast
        .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT)
        .show();
    }
  }
}
于 2012-08-18T04:39:32.510 に答える
0

ListViewのため、adapterもその基になるデータも、UI スレッド以外のスレッドから更新することはできません。更新はメイン アプリケーション スレッドで実行する必要があります。非 UI スレッドは、post()またはrunOnUiThread()などを使用して更新を呼び出すことができます。

notifyDatasetChanged()そのように呼び出すのはあまり良い方法ではありませんAdapter。それ自体またはデータを変更するオブジェクトによって呼び出す必要があります。

ネットワークの動作が遅いため、ダウンロードしたデータを に保存することが望ましくないかどうかを検討してくださいdatabase。ある種の を実装して終了するよりもCursorAdapter、 を使用するのが最適です。これにより、作業スレッドでLoader更新すると、変更について自動的に通知されます。databaseListView

于 2012-08-16T22:01:18.440 に答える
0

ここから始められると思います: http://www.vogella.com/articles/AndroidPerformance/article.html

そのため、データのためにサーバーへの非同期呼び出しを行う必要があります。または、そのためにバックグラウンド タスクを実行することもできます。

Google でAsyncTask検索するか、stackoverflow で検索できます。以下に例を示します: AsyncTask Android の例

于 2012-08-16T21:21:53.780 に答える