2017-02-19 21 views
2

我的應用正在使用Firebase,並且在特定時間有近200名用戶在線。大多數用戶抱怨數據無法加載。我使用ChildEventListener來獲取保持連接的數據並反映實時更改。免費計劃中有100個連接的限制。我想這就是我的數據有時無法加載的原因。閱讀完文檔後,我發現了另一種使用ValueEventListener讀取數據的方法。下面是我目前使用當免費計劃中有超過100個實時連接時,Firebase ValueEventListener調用是否成功?

 public void getImages() { 
     Query imagesQuery = FirebaseDatabase.getInstance().getReference().child("englishDps").child(mChildName).orderByKey().limitToLast(21); 

     ChildEventListener childEventListener = new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       Image image = dataSnapshot.getValue(Image.class); 
       image.setNodeKey(dataSnapshot.getKey()); 

       mTempImages.add(image); 
       if (mTempImages.size() == 21) { 
        mLastKey = mTempImages.get(0).getNodeKey(); 
        Collections.reverse(mTempImages); 
        mTempImages.remove(mTempImages.size() - 1); 
        mImages.addAll(mTempImages); 
        setAdapter(); 
       } 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       if (isAdded()) { 
        Toast.makeText(getActivity(), "Problem loading more images...", Toast.LENGTH_LONG).show(); 
       } 
      } 
     }; 

     ValueEventListener valueEventListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       for(DataSnapshot imageSnapshot : dataSnapshot.getChildren()) 
       { 
        Image image = imageSnapshot.getValue(Image.class); 
        image.setNodeKey(imageSnapshot.getKey()); 

        mTempImages.add(image); 
        if (mTempImages.size() == 21) { 
         mLastKey = mTempImages.get(0).getNodeKey(); 
         Collections.reverse(mTempImages); 
         mTempImages.remove(mTempImages.size() - 1); 
         mImages.addAll(mTempImages); 
         setAdapter(); 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }; 

//  imagesQuery.addChildEventListener(childEventListener); 
//  imagesQuery.addValueEventListener(valueEventListener); 
     imagesQuery.addListenerForSingleValueEvent(valueEventListener); 
    } 

按照文檔

「邊使用ChildEventListener代碼讀取列表數據的 推薦的方式,存在附加ValueEventListener到的情況 名單的參考是非常有用的。

附加一個ValueEventListener數據的列表將返回數據的 整個列表作爲一個單一的DataSnapshot,你可以再循環 在訪問個人的孩子。

即使查詢只有一個匹配項,快照仍然是 列表;它只包含一個項目。要訪問該項目,您需要遍歷結果: 。

當您想要在單個操作中獲取列表中的所有子項而不是偵聽onChildAdded事件時,此模式可能很有用。

我在想這樣便解決了數據加載問題,但我以前的版本的應用使用實時連接仍然會保持和我仍然看到在新版本的數據加載調用隨機的成功和失敗如果舊版本的應用程序打開超過100個連接,並且新版本的應用程序試圖加載數據,會發生什麼情況?例如,如果在應用程序中有100個連接免費計劃用於將

imagesQuery.addListenerForSingleValueEvent(valueEventListener); 

查詢成功還是失敗?

+0

什麼是圖像文件的限制?例如讀寫 – user7568042

+0

我只是儲存圖片網址 –

回答

1

當Android應用首先使用火力地堡數據庫SDK,它使對火力地堡服務器的連接。如果此時已經有許多連接被允許到您的數據庫中,則新連接將被拒絕。聽衆的類型對此沒有影響。

有關這方面的很多討論,請參閱。一些好的:

+0

接收了付費方案:D –