Firebase android如何一次从Key列表中获取数据

时间:2016-07-21 14:13:17

标签: android android-asynctask firebase firebase-realtime-database geofire

我正在使用firebase geofire库来获取基于位置的键,但是因为每次我必须使用键引用firebase并返回对象并将其设置为listview变得非常时,onKeyEntered()事件中会返回数千个键慢。我尝试评论onKeyEntered()中的所有其他工作,看看geofire有多快,然后我惊讶地收到了900毫的所有回调。

那么现在使用onKeyEntered()回调中传递的密钥从firebase获取数据的最佳优化方法是什么,并将其设置为listview,以便即使对于数千个条目,listview应该加载 < / p>

我想到每次回调中的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();

        }
    });
}

1 个答案:

答案 0 :(得分:1)

类型问题&#34;如何最好&#34;众所周知很难回答。但是,我会提供一些您可能不了解的系统的一般行为提示。

  1. Firebase数据库客户端在单独的线程上与网络和磁盘进行交互。当数据可用于您的客户端时,它会在主/ UI线程上调用您的处理程序。这意味着,如果您要在回调中做重要的工作,那么将您的通话置于AsyncTask之后才有用。
  2. Firebase数据库客户端通过单个连接管理对服务器的调用。要详细了解影响效果的原因,请参阅Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly
  3. 通过网络将数千个项目加载到移动设备中通常不是一个好主意。您应该只加载您向用户显示的数据,并且数千个项目远远超出了在移动屏幕上合理显示的内容。在开发基于位置的应用程序时,您可以显示用户指示热点的地图,并使用地理查询仅请求该位置周围的项目。