2017-10-09 41 views
0

假如我是從火力爲Android的火力得到datasnapshot串到外面

DatabaseReference mdb=FirebaseDatabase.getInstance().getReference("users/"+id); 
     mdb.addValueEventListener(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String name=dataSnapshot.child("name").getValue(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 

     }); 

//point b 

其正常使用....獲取數據 如果我嘗試打印使用

@Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String name=dataSnapshot.child("name").getValue(); 
       System.out.println(name); 
      } 
該字符串名稱

它將打印該字符串。 但如果我想在偵聽器之外的字符串名稱,如在第一個代碼中,我已經添加了一個註釋//點b

我試着在全局定義字符串名稱。 但它只打印在onDatachange()中的println ...但它將在//點b處打印null ...即使我全局定義了字符串名稱。

String name; 
    DatabaseReference mdb=FirebaseDatabase.getInstance().getReference("users/"+id); 
     mdb.addValueEventListener(new ValueEventListener() { 

      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       name=dataSnapshot.child("name").getValue(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 

     }); 

//point b 

編輯 實際上它返回像

public String getData(String id) 
{ 
String name; 
     DatabaseReference mdb=FirebaseDatabase.getInstance().getReference("users/"+id); 
      mdb.addValueEventListener(new ValueEventListener() { 

       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        name=dataSnapshot.child("name").getValue(); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 

      }); 

return name; 

} 
+0

其打印'null'值是異步 – akhilesh0707

+0

手段?我不能在外面打印? –

+0

您的打印代碼在Firebase聽衆返回值 – akhilesh0707

回答

0

數據的字符串值的函數從火力地堡異步加載,不幸意味着你想辦法贏不可能

最簡單的方法是通過簡化您的代碼只是一些日誌語句:

DatabaseReference mdb=FirebaseDatabase.getInstance().getReference("users/"+id); 
    System.out.println("Before attaching listener"); 
    mdb.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      System.out.println("Inside onDataChange"); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      throw databaseError.toException(); // Don't ignore errors 
     } 

    }); 
    System.out.println("After attaching listener"); 

當你運行這段代碼將打印:

之前安裝監聽器

連接監聽器

內onDataChange

後那大概是不是您希望的輸出,但可以很好地解釋爲什麼您無法從您的函數返回name:執行return語句時,數據尚未從Firebase加載。

沒有辦法等待數據可用。即使有,它也會導致您的應用程序被阻止,並且Android會顯示臭名昭着的「應用程序未響應」對話框。

相反,您需要將需要訪問名稱的代碼移動到 onDataChange方法中,就像您在打印時所做的那樣。

另見:因爲火力地堡聽衆的