1

場所に基づいてキーを取得するためにfirebase geofireライブラリを使用していますが、キーを取得してfirebaseを参照し、オブジェクトを取得してリストビューに設定する必要があるたびに、何千ものキーが onKeyEntered() イベントに返されるため、非常に遅くなります。onKeyEntered() で他のすべての作業にコメントしてみて、ジオファイアの速さを確認しましたが、900 ミリのすべてのコールバックが受信されたことに驚きました。

onKeyEntered() コールバックで渡されたキーを使用してfirebaseからデータを取得し、リストビューに設定して、何千ものエントリでもリストビューが高速にロードされるようにするための最適化された最適な方法は何ですか

私はすべてのコールバックで AsyncTask を考え、データの取得作業を AsyncTask に渡し、次のコールバック キーに進み、同じことを行いましたが、それが正しいかどうかはわかりません。

または、ほんの少しだけロードしてからスクロールとしてロードすることも良い考えですが、ジオファイアはデータベース全体からキーを返すため、最新のものをいくつか取得するオプションがないため、実装方法がわかりません。

これは私が試していることですが、リスト ビューの読み込みが非常に遅くなります。

  @Override
public void onKeyEntered(String key, GeoLocation location) {
    Log.d("geoevent", key);
    mDatabaseTemp = FirebaseDatabase.getInstance().getReference("/posts/" + key);
    mDatabaseTemp.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Post post = new Post();
            post = dataSnapshot.getValue(Post.class);
            mPosts.add(post);
            mPostAdapter.notifyDataSetChanged();
            mRecycler.smoothScrollToPosition(mPosts.size() - 1);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(getActivity(), "error" + databaseError, Toast.LENGTH_LONG).show();

        }
    });
}
4

1 に答える 1

1

「最善の方法」タイプの質問は、答えるのが難しいことで有名です。ただし、システムの一般的な動作について、あなたが気付いていないかもしれないヒントをいくつか紹介します。

  1. Firebase データベース クライアントは、別のスレッドでネットワークおよびディスクとやり取りします。クライアントがデータを利用できるようになると、メイン/UI スレッドでハンドラが呼び出されます。つまり、呼び出しを に配置するのAsyncTaskは、コールバックで重要な作業を行う場合にのみ役立ちます。
  2. Firebase データベース クライアントは、単一の接続を介してサーバーへの呼び出しをパイプライン処理します。それがパフォーマンスに影響を与える理由の詳細については、単一のイベントを繰り返し観察する代わりにクエリを使用して、ソーシャル ネットワーク アプリの投稿のフェッチを高速化する を参照してください。
  3. ネットワーク経由で何千ものアイテムをモバイル デバイスにロードすることは、一般的には良い考えではありません。ユーザーに表示するデータのみをロードする必要があり、何千ものアイテムがモバイル画面で合理的に表示できる範囲をはるかに超えています。ロケーションベースのアプリを開発する場合、ユーザーがホットスポットを示すマップを表示し、ジオクエリを使用してそのスポット周辺のアイテムのみをリクエストできます。
于 2016-07-21T14:50:19.900 に答える