2017-10-18 30 views
0

我想要做的是獲取OnDataSnapshot以外的值,但始終返回null。我如何從外部訪問它? 由於是異步的,它總是返回null。 我已經嘗試了幾乎所有堆棧溢出的方法,但都沒有爲我工作。 幫我把這個值從這個函數中取出來。 下面是我的代碼:我已經聲明字符串外我無法在Firebase的onDataSnapshot之外獲得價值

final DatabaseReference grpinfo = FirebaseDatabase.getInstance().getReference().child("Users").child(uid).child("Group"); 
    //listner not working properly 
    grpinfo.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      group = dataSnapshot.getValue().toString(); 
      //cant get this value outside 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    //returns null in Toast 
    Toast.makeText(getApplicationContext(),group,Toast.LENGTH_LONG).show(); 
+2

請在文章中包含代碼的文本,而不是圖片。 – ImaginaryHuman072889

+0

已嘗試採取靜態# –

+0

void getDataSnapShot(DataSnapshot dataSnapshot)創建函數並在外部使用它 –

回答

0

考慮到你是一個活動,你爲什麼不創建活動中二傳手用字符串參數去保存你的數據?

private String group; 
public void setGroup(String group){ 
    this.group = group; 
} 

而在你onDataChange方法您設置組:

String group = dataSnapshot.getValue().toString(); 
setGroup(group); 
0

你是一個每個聽者觸發時,宣佈了新的group字符串,因此試圖訪問聽者之外group的價值範圍將檢索爲空,因爲它沒有在那裏定義。

從火力地堡與聽衆得到一個值簡單:

  • 聲明String group變量聽者的範圍之外的onDataChange
  • 簡單dataSnapshot的價值分配給您的字符串,這樣group變量將可用(具有其新價值)在聽衆範圍之外。

例如

String group; 

grppinfo.addListenerForSingleValueEvent(new ValueEventListener(){ 
    @Override 
    public void onDataChange(Datasnapshot datasnapshot) { 
    group = dataSnapshot.getValue().toString(); 
    } 
    ... 
}); 

注:從數據庫中檢索數據時檢查datasnapshot不爲空,否則可能出現的情況,當你將最終拋出nullPointerException這是很好的做法。

0

不能只是聲明group變量作爲一個全局變量,並在代碼中使用它,因爲onDataChange()方法稱爲異步。這意味着即使您試圖從數據庫獲取數據,您嘗試顯示的Toast也會被調用,這就是爲什麼始終是null

所以爲了解決這個問題,你需要使用下面這行代碼:

Toast.makeText(getApplicationContext(),group,Toast.LENGTH_LONG).show(); 

onDataChange()方法,這將肯定工作,或者如果你想使用外onDataChange()方法的價值,我建議你看到我的答案從post

0

我遇到了一個骯髒的黑客,但它的工作。我使用SharedPreferences將值存儲在onDataChange中,然後使用SharedPreferences獲取值。它工作正常,因爲每次在數據庫中更改數據時都會調用onDataChange,從而更新sharedpreferences值。這是代碼。

mDatabase.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      String name= dataSnapshot.getValue().toString(); 

      setKeys= getSharedPreferences("Name", Context.MODE_PRIVATE); 
      editKeys=setKeys.edit(); 
      editKeys.putString("name",name); 
      editKeys.apply(); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    });