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 值的原因。希望这能让它更清楚一些。