Java 变量无故更改
我正在尝试创建自己的适配器。每次适配器调用getView时,都会执行以下代码:Java 变量无故更改,java,android,firebase,Java,Android,Firebase,我正在尝试创建自己的适配器。每次适配器调用getView时,都会执行以下代码: private String readDatabaseValue(String id) { id = id.replace("-", "").toLowerCase(); int index = id.indexOf("fr"); final String nb = id.substring(index + 2); String sub = id
private String readDatabaseValue(String id)
{
id = id.replace("-", "").toLowerCase();
int index = id.indexOf("fr");
final String nb = id.substring(index + 2);
String sub = id.replace(nb, "") ;
DatabaseReference myRef = database.getReference(sub).child(nb);
myRef.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
message = (String) dataSnapshot.getValue();
if (message == null)
Log.d("MESSAGE1", nb + " is null");
else
Log.d("MESSAGE1", message);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
if (message == null)
Log.d("MESSAGE2", id + " is null");
else
Log.d("MESSAGE2", message);
return message;
}
但是,MESSAGE1有时会给我正确的消息,而MESSAGE2总是返回null。
那么,为什么会发生变化呢?
message是一个全局变量每次构造新的视图对象时都会调用addValueEventListener,因此
您还必须在onDataChange回调中包含MESSAGE2处理。它不会无缘无故地更改 您的return语句可能发生在message1被分配之前,并返回null},因为Firebase需要网络调用,并且将被延迟 在回调中分配全局变量通常是一种错误的模式,不会通知任何值正在更改。目前还不清楚您的消息在视图中是如何使用的,但您需要通过回调,正如Andy在评论中提到的那样 例如,定义一些接口
public interface Callback<T> {
void onMessage(T message);
}
然后将其添加为参数
void readDatabaseValue(String id, final Callback<String> cb) {
...
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
message = (String) dataSnapshot.getValue();
cb.onMessage(message);
}
});
return; // for demonstration purposes
}
然后将其传递到查找值的位置
// do not declare message variable outside of here
readDatabaseValue(id, new Callback<String>() {
@Override
public void onMessage(String message) {
// value is returned here, and you're welcome to pass it on to other methods
}
});
// do not try to access a message variable here, it will be null
这不应该编译。在任何方法之外都有一个return语句。请将您的完整代码显示为@cricket_007我更新了我的代码。谢谢你的帮助,但是我应该怎么做才能让它工作呢?你需要将回调模式传播到calltree上-所以把readDatabaseValue看作是启动读取并添加一个回调参数,该参数在onDataChange.message中被调用。message不是一个全局变量,因为Java没有全局变量。你大概是说它是这个类的一个字段。当您记录它时,它还没有被设置为任何值,这就是它为null的原因。它肯定不是一个全局变量,因为Java.Eh中没有这样的东西。只是写下问题所在