java - 无故改变变量
问题描述
我正在尝试创建自己的适配器。每次适配器调用 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。那么为什么会发生变化呢?(消息是一个全局变量)
解决方案
它不会“无缘无故”地改变。
您的 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
推荐阅读
- html - 在响应式 div 下定位文本
- amazon-web-services - 如何使用 AWS CLI 将标签添加到 S3 存储桶而不删除现有标签?
- python - 使用 pygslib 将 vtkImageData 转换为 vtkPolyData
- android - 如何完全离线使用 Android Studio
- label - 使用 TensorFlow 创建标签映射
- python - 根据另一个 Series 值重新排列 Series 值
- excel - Excel - 具有多个日期范围和一个条件的条件格式
- autostart - 如何从 Windows 10 启动 xrdp 服务?(常规解决方案不起作用)
- javascript - 即使请求成功,下载文件也失败
- android - 有没有办法为循环内的某个视图设置边距?