1

firebase geofireライブラリを使用して、場所に基づいてキーを取得しますが、キー参照firebaseを使用するたびに、数千のキーがonKeyEntered()イベントで返されるためです。オブジェクトを元に戻し、リストビューを非常に遅くするように設定します。私はonKeyEntered()の他のすべての仕事をコメントして、geofireがどれくらい速いかを見てみました。受け取った900ミリ秒のコールバックをすべて驚かせました。Firebase androidデータを取得する方法

だから今のエントリのリストビューの何千も速い

Iをロードする必要がありさえのためになるようにonKeyEntered()コールバックに渡されたキーを使用してfirebaseからデータを取得し、リストビューに設定するための最良の最適化の方法は何ですかすべてのコールバックでAsyncTaskを考えると、取得データがAsyncTaskに渡され、次のコールバックキーが実行され、同じことが実行されますが、正しいことはわかりません。

また、ほんの少しだけ読み込んでスクロールして読み込むこともお勧めしますが、geofireはデータベース全体からキーを返すため、最新のものを取得するオプションがないため、実装方法がわかりません。

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

@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(); 

     } 
    }); 
} 
+0

私は以下にいくつかのヒントを書いたが、一般的にこの質問は広すぎる。 1つの質問に限定してください。 "なぜアイテムは私が予想したよりも早く戻ってくるの?" (これは[要求がパイプライン化されているためです](http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of -obse/35932786#35932786)btw)。 –

答えて

1

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

  1. Firebaseデータベースクライアントは、別のスレッドでネットワークとディスクとやり取りします。クライアントのデータが利用可能になると、メイン/ UIスレッドでハンドラが呼び出されます。これは、コールをAsyncTaskに入れることは、コールバックで重要な作業を行う場合にのみ有効であることを意味します。
  2. Firebaseデータベースクライアントは、1回の接続でサーバーへの呼び出しをパイプラインします。パフォーマンスに影響を与える理由の詳細については、Speed up fetching posts for my social network app by using query instead of observing a single event repeatedlyを参照してください。
  3. ネットワーク経由で何千ものアイテムをモバイルデバイスにロードすることは一般的には良い考えではありません。ユーザーに表示するデータと、何千ものアイテムを読み込むだけで、モバイル画面に合理的に表示できるデータを上回るようにする必要があります。場所ベースのアプリを開発するときは、ユーザーがホットスポットを示し、ジオクエリを使用してその場所の周辺のアイテムのみをリクエストするマップを表示できます。
+0

geofireライブラリでは、すべてのキーを即座にフェッチするのが好きでしたが、一般的には、特定の場所のデータを取得し終えると、すべてのコールバックが必要です。 –

+0

あなたの3番目のポイントでは、最近の記事はほとんど表示しませんが、geofireライブラリはxの場所に格納されているすべてのアイテムのコールバックを行います。だから何千ものポストがx位置で利用可能ならば、最初に格納されたエントリーからすべてのコールバックを返し、最近追加されたポストだけを表示するようにします。コールバックをすべて調べ、firebaseを参照してデータをフェッチし、したがって実際にはすべてのアイテムを表示するのと同じ時間がかかります。これを行うための推奨方法を提供できる場合は役立ちます。事前に感謝します –

+0

最近のアイテムだけを取得したい場合、最近のアイテムのために別のジオノードを保持することはどうですか?これにより、クライアント側のフィルタリングが不要になり、ユーザーの帯域幅使用量が大幅に削減されます。 –

関連する問題