Tôi đang sử dụng tính năng cơ sở dữ liệu Thời gian thực của Firebase trong Ứng dụng của tôi. Cơ sở dữ liệu trông giống như sau: Android: Firebase mất quá nhiều thời gian để lấy dữ liệu
Các nút 104, 1040 ... đang có thêm các yếu tố/dữ liệu. Tôi đang lấy dữ liệu này sắp xếp nó theo giá trị tại một nút 'updatedAt' có sẵn trong mỗi phụ huynh Integer như được hiển thị trong snap. Tôi đang sử dụng onChildAddedListener()
để tìm nạp 20 phần tử cuối cùng. Có khoảng 1050 nút trong 'kết quả'.
Vấn đề:
Các quyến rũ của dữ liệu mất quá nhiều thời gian, khoảng 30 giây, thậm chí trên WiFi tốc độ cao.
Firebase có cho phép bất kỳ cuộc gọi lại nào thông báo rằng dữ liệu đã được tìm nạp không? Tôi muốn nối thêm mọi đối tượng tùy chỉnh vào
ArrayList
nhận được từ Firebase và chuyển nó qua mục đích đến một hoạt động khác. Tôi đếm các đối tượng nhận được và khi nó trở thành 20, tôi mở Hoạt động của mình. Đó có phải là cách duy nhất để làm như vậy không? Nếu có một số cách tốt hơn, làm đề nghị.
Đây là mã của tôi:
public class Splash extends AppCompatActivity{
private static final String TAG = "Splash Activity";
private ArrayList<News> NewsArrayList = new ArrayList<>();
private DatabaseReference newsReference;
private int position = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
newsReference = FirebaseDatabase.getInstance().getReference().child("results");
Query queryNewsReference = newsReference.orderByChild("updatedAt").limitToLast(20);
fetchNews(queryNewsReference);
}
private void fetchNews(Query queryNewsReference) {
queryNewsReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());
News newsObject = dataSnapshot.getValue(News.class);
Log.d(TAG,"News Title: "+ newsObject.getVideo_title());
NewsArrayList.add(newsObject);
position++;
if(position == 20){
startMainActivity();
}
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s){
Log.d(TAG, "onChildChanged() called on key: "+ dataSnapshot.getKey());
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.d(TAG, "onChildRemoved() called on key: "+ dataSnapshot.getKey());
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
Log.d(TAG, "onChildMoved() called on key: "+ dataSnapshot.getKey());
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG,"Database Error: "+databaseError.toString());
}
});
}
private void startMainActivity() {
Intent intent = new Intent(Splash.this,MainActivity.class);
intent.putExtra("NewsList",NewsArrayList);
Splash.this.startActivity(intent);
}
Liệu sự chậm trễ 30 giây xảy ra trước khi bạn nhìn thấy đầu tiên "onChildAdded" nhắn logcat ? Khi bạn thấy "onChildAdded" đầu tiên, những người khác có theo dõi ngay lập tức không? –
@qbix Có. Độ trễ 30 giây trước khi tôi nhìn thấy 'onChildAdded' đầu tiên. BTW sự khác biệt là gì? Nếu onChildAdded() được gọi thì nó có nghĩa là dữ liệu đã được tìm nạp, phải không? – brainbreaker
Chỉ cần tìm manh mối. FWIW Tôi đã tạo ra một trường hợp thử nghiệm rất giống với trường hợp của bạn (1100 đối tượng, được đặt hàng bởi con, giới hạn trong 20) và không thấy sự chậm trễ. Tôi đang ở California - có thể kết nối tốt hơn với các máy chủ hơn bạn. –