1

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

那么现在使用 onKeyEntered() 回调中传递的键从 firebase 获取数据并将其设置为 listview 的最佳优化方法是什么,这样即使对于数千个条目,listview 也应该快速加载

我在每个回调中都想到了 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();

        }
    });
}
4

1 回答 1

1

众所周知,“如何做到最好”类型的问题很难回答。但是我会给出一些你可能不知道的系统的一般行为的提示。

  1. Firebase 数据库客户端在单独的线程上与网络和磁盘交互。当数据可供您的客户端使用时,它会在主/UI 线程上调用您的处理程序。这意味着AsyncTask仅当您将在回调中做大量工作时,将调用放入 an 中才有用。
  2. Firebase 数据库客户端通过单个连接将调用传递给服务器。要详细了解这会影响性能的原因,请参阅使用查询而不是重复观察单个事件来加快获取我的社交网络应用程序的帖子
  3. 通过网络将数千个项目加载到移动设备中通常不是一个好主意。您应该只加载您将向用户显示的数据,并且数以千计的项目远远超出了移动屏幕上可以合理呈现的内容。在开发基于位置的应用程序时,您可以显示用户指示热点的地图,并且您使用地理查询仅请求该地点周围的项目。
于 2016-07-21T14:50:19.900 回答