我的問題是我需要在我的按鈕上單擊兩次才能執行 ValueEventListener。第一次在沒有驗證的情況下進入另一個活動并作業時,我需要在模擬器中按下回傳按鈕,然后再次按下搜索按鈕(意圖按鈕)。
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
databaseReference.child("calendar").child("adrian").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.hasChild(month1.toLowerCase(Locale.ROOT))) {
for (int i = Integer.parseInt(date1); i <= Integer.parseInt(date2); i ) {
if (snapshot.child(month1.toLowerCase(Locale.ROOT)).hasChild(String.valueOf(i))) {
x ;
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
Intent intent = new Intent(MainActivity.this,Image.class);
intent.putExtra("x",String.valueOf(x));
startActivity(intent);
}
});
uj5u.com熱心網友回復:
問題是對 Firebase(和大多數云 API)的呼叫是異步的,它們允許您的主代碼在后臺加載資料時繼續。然后,一旦資料可用,onDataChange就會呼叫你的。
在實踐中,這意味著您在被呼叫intent.putExtra("x",String.valueOf(x));之前運行良好x ,您可以通過在除錯器中運行或放置一些日志陳述句來最輕松地驗證這一點。
解決方案是所有需要資料庫資料的代碼都必須在內部 onDataChange,從那里呼叫,或者以其他方式同步。所以最簡單的修復:
databaseReference.child("calendar").child("adrian").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.hasChild(month1.toLowerCase(Locale.ROOT))) {
for (int i = Integer.parseInt(date1); i <= Integer.parseInt(date2); i ) {
if (snapshot.child(month1.toLowerCase(Locale.ROOT)).hasChild(String.valueOf(i))) {
x ;
}
}
// ??
Intent intent = new Intent(MainActivity.this,Image.class);
intent.putExtra("x",String.valueOf(x));
startActivity(intent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
throw error.toException(); // ?? Also: never ignore errors
}
});
另見:
- getContactsFromFirebase() 方法回傳一個空串列
- 在 Firebase 偵聽器中設定 Singleton 屬性值
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/439750.html
標籤:安卓 火力基地 firebase-实时数据库
