addValueEventListener(new ValueEventListener() 不读取数据
addValueEventListener(new ValueEventListener() doesn't read data
在我下面的代码中,函数 setPhoto(url) 总是接收到空值 url,但是如果我通过单击按钮调用另一个函数并且它需要它接收到的 url正确的数据。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_perfil);
reference = mDatabaseAPI.getUserReferenceByUid(user.getUid()).child(PHOTO_URL);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
url = dataSnapshot.getValue(String.class);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(Perfil.this, "La lectura de la foto falló", Toast.LENGTH_LONG).show();
}
});
setPhoto(url);
}
您正在进行的调用是异步的。您需要将 setPhoto(url)
移动到 onDataChange()
,就在您对 url
:
进行赋值之后
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
url = dataSnapshot.getValue(String.class);
setPhoto(url);
}
您是否在其他任何地方初始化 url 实例:
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
url = dataSnapshot.getValue(String.class);
}
如果不是,那么调用函数setPhoto(url)时url的值是多少?它将是您在此 activity 中初始化 url 的任何内容。如果用 null 初始化,它将为 null。为什么不将 setPhoto(url) 移动到 onDataChange(..) 方法中,紧跟在语句
之后
url = dataSnapshot.getValue(String.class);
这样,您就可以确定 url 有一个值。单击按钮时初始化 url 的原因很可能是因为 ValueEventListener 是通过调用 onDataChange(...) 方法调用的。这就是单击按钮时正确获取 url 值的原因。希望这能让它更清楚一些。
在我下面的代码中,函数 setPhoto(url) 总是接收到空值 url,但是如果我通过单击按钮调用另一个函数并且它需要它接收到的 url正确的数据。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_perfil);
reference = mDatabaseAPI.getUserReferenceByUid(user.getUid()).child(PHOTO_URL);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
url = dataSnapshot.getValue(String.class);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(Perfil.this, "La lectura de la foto falló", Toast.LENGTH_LONG).show();
}
});
setPhoto(url);
}
您正在进行的调用是异步的。您需要将 setPhoto(url)
移动到 onDataChange()
,就在您对 url
:
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
url = dataSnapshot.getValue(String.class);
setPhoto(url);
}
您是否在其他任何地方初始化 url 实例:
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
url = dataSnapshot.getValue(String.class);
}
如果不是,那么调用函数setPhoto(url)时url的值是多少?它将是您在此 activity 中初始化 url 的任何内容。如果用 null 初始化,它将为 null。为什么不将 setPhoto(url) 移动到 onDataChange(..) 方法中,紧跟在语句
之后url = dataSnapshot.getValue(String.class);
这样,您就可以确定 url 有一个值。单击按钮时初始化 url 的原因很可能是因为 ValueEventListener 是通过调用 onDataChange(...) 方法调用的。这就是单击按钮时正确获取 url 值的原因。希望这能让它更清楚一些。