Java 变量无故更改

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

我正在尝试创建自己的适配器。每次适配器调用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.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中没有这样的东西。只是写下问题所在