首页 > 解决方案 > 无故改变变量

问题描述

我正在尝试创建自己的适配器。每次适配器调用 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。那么为什么会发生变化呢?(消息是一个全局变量)

标签: javaandroidfirebase

解决方案


它不会“无缘无故”地改变。

您的 return 语句可能发生message1 甚至被分配之前(并返回 null} 因为 Firebase 需要网络调用并且会被延迟

您在回调中分配“全局变量”的事实通常是一种错误的模式(没有通知值正在更改)。目前尚不清楚您的消息是如何在您的视图中使用的,但您需要通过回调,正如安迪在评论中提到的那样

比如定义一些接口

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 

推荐阅读