等待从Firebase实时数据库检索到静态数据



在屏幕上显示一段时间后,我需要从Firebase实时数据库中检索当前用户的用户名,然后开始新的活动。有时我们无法检索用户名,因为用户并没有互联网连接。在这种情况下,我想在屏幕上显示消息;等待互联网响应";然后重新启动监听器。我该怎么做?我写了一些代码,但方法onCanceled从未调用过,我想这是错误的方法

TextView welcome = findViewById(R.id.textView2);
final DatabaseReference nickname = FirebaseDatabase.getInstance().getReference("Users")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("nickname");
nickname.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
String username = snapshot.getValue(String.class);
welcome.setText("Welcome back n" + username + "!");
nickname.removeEventListener(this);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
finish();
startActivity(new Intent(SplashActivity.this, MapsActivity.class));
}
}, SPLASH_TIME_OUT);
};
@Override
public void onCancelled(@NonNull DatabaseError error) {
welcome.setText("Waiting for internet response)");
}
});

当服务器拒绝读取操作时,会调用onCancelled方法,这通常是因为您的安全规则不允许用户读取他们试图访问的数据。因此,更好的显示信息是:

@Override
public void onCancelled(@NonNull DatabaseError error) {
welcome.setText("You do not have permission to access this data");
Log.e("Firebase", "Unable to read nickname", error.toException());
}

要显示您正在等待数据的消息,您需要在开始加载数据之前显示该消息,并在加载数据或取消加载时隐藏该消息。

所以类似于:

final DatabaseReference nickname = FirebaseDatabase.getInstance().getReference("Users")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("nickname");
welcome.setText("Loading nickname..."); // 👈
nickname.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
String username = snapshot.getValue(String.class);
welcome.setText("Welcome back n" + username + "!");
nickname.removeEventListener(this);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
finish();
startActivity(new Intent(SplashActivity.this, MapsActivity.class));
}
}, SPLASH_TIME_OUT);
};
@Override
public void onCancelled(@NonNull DatabaseError error) {
welcome.setText("You do not have permission to access this data");
Log.e("Firebase", "Unable to read nickname", error.toException());
}
});

最新更新