2016-09-06 71 views
1

我不確定它是disconect或DatabaseErrors事件。首先我有一個對話框顯示時,在火力地堡開始加載數據,然後我要解僱該對話框中的兩個案例:Firebase處理disconect到數據庫

  1. 有互聯網:加載數據成功,我在onDataChange dissmiss對話框。

  2. 沒有互聯網連接或在應用程序啓動時快速關閉wifi。

在第二種情況下,我認爲它會調用onCancelled,並在該方法中,我將關閉對話框。但實際上,這不是要求取消。

那麼,我如何可以在第二種情況下解除對話。這裏是我的代碼

private void getCategory() { 
    mDatabase = FirebaseDatabase.getInstance().getReference(); 
    mDatabase.child(ReferenceToFirebase.CHILD_CATEGORIES) 
      .addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        //do something 

        //then dismiss dialog 
        mDialog.dismiss(); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        mDialog.dismiss(); 
       } 
      }); 
} 

回答

1

onCancelled()被調用時,服務器將拒絕監聽,通常當用戶沒有權限訪問數據。

如果您沒有與Firebase數據庫的連接,則可能需要阻止附加偵聽器。爲此,您可以listen to .info/connected,並且只有在偵聽器爲真時才附加。

mDatabase = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference connectedRef = mDatabase.child(".info/connected"); 
connectedRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    boolean connected = snapshot.getValue(Boolean.class); 
    if (connected) { 
     mDatabase.child(ReferenceToFirebase.CHILD_CATEGORIES) 
      .addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        //do something 

        //then dismiss dialog 
        mDialog.dismiss(); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        System.err.println("Listener was cancelled"); 
        mDialog.dismiss(); 
       } 
     }); 
    } else { 
     System.out.println("not connected"); 
     mDialog.dismiss(); 
    } 
    } 

    @Override 
    public void onCancelled(DatabaseError error) { 
    System.err.println("Listener was cancelled"); 
    } 
});