2016-06-08 21 views
5

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: database snapAndroid: 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 đề:

  1. 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.

  2. 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); 
     } 
+0

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? –

+0

@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

+0

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. –

Trả lời

0

Cố gắng kết nối lại với căn cứ hỏa lực trước khi thêm giá trị nghe:

private void fetchNews(Query queryNewsReference) 
{  
    if (FirebaseDatabase.getInstance() != null) 
    { 
     FirebaseDatabase.getInstance().goOffline(); 
    } 

    FirebaseDatabase.getInstance().goOnline(); 

    queryNewsReference.addChildEventListener(new ChildEventListener() { 

    ... 
} 
Các vấn đề liên quan