java - 如何将匿名侦听器接口中的数据保存到android上的全局变量中?
问题描述
我试图从 Firebase 数据库中获取数据并将数据保存到全局变量(mExampleHashMap)中,这样我就可以在其他地方使用它,例如在 windowinfoclick 侦听器上。但是,数据仅在事件侦听器中有效,我无法从中获取这些数据。似乎它与变量范围有关,所以我试图在该全局变量上使其成为最终但仍然不起作用。如何将匿名接口中的数据保存到本地主变量?
final HashMap<Marker, Example> mExampleHashMap = new HashMap<>();
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(true);
// Get data from firebase database
mDatabase = FirebaseDatabase.getInstance();
mDatabaseReference = mDatabase.getReference();
mDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot d : dataSnapshot.getChildren()) {
String name = (String) d.child("example").getValue();
String x = (String) d.child("x").getValue();
String y = (String) d.child("y").getValue();
mExample = new Example(example, x, y);
if (mExample != null) {
Marker marker = mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(x), Double.parseDouble(y))).title(name));
mExampleHashMap.put(marker, mExample );
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
// When I tried to use data out of the event listener, the variable is empty.
Log.d(TAG, "onMapReady: mExampleHashMap: " + mExampleHashMap.size());
}
解决方案
这根本不是变量的范围。您只是在数据准备好之前记录值。所有 Firebase API 都是异步的,并在您使用addValueEventListener
. 回调仅在数据库查询完成时调用,然后在每次更改后再次调用。
的值mExampleHashMap
可以在编译器允许的范围内的任何地方使用——它只是在调用回调之后才具有您想要的值。
推荐阅读
- php - php准备好的语句不显示用户数据
- javascript - 如何在 Range 的末尾插入节点?
- python - 石墨烯突变:如何将参数传递给模式执行
- php - 如何在 php 中创建嵌套的 JSON 对象?
- json - 无法通过 jq 查询超过 json 的第 3 级
- android - Recyclerview 列表到服务器
- sql - 在 presto 上的多列上选择不同的连接
- amazon-web-services - AWS EC2 Ubuntu 16.04 64bit中的VS Code远程连接内存不足
- r - 如何按R中每列中的最后一个值对数据框中的列进行重新排序
- r - R-shiny app-DT包栏目信息