我正在使用 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();
}
});
}