如何将匿名监听器接口中的数据保存到android上的全局变量中?[重复]

问题描述 投票:0回答:1

我试图从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());

}
java android firebase variables anonymous-function
1个回答
1
投票

这根本不是变量的范围。 你只是在数据准备好之前记录了值。 所有的Firebase API都是异步的,并且在你添加了监听器之后的一段时间内完成。addValueEventListener. 回调只有在数据库查询完成后才会被调用,之后的每一次变化都会再次调用。

回调的值是 mExampleHashMap 可以在编译器允许的范围内的任何地方使用--只是在回调被调用后才有你想要的值。

阅读关于 为什么Firebase的API是异步的?.

© www.soinside.com 2019 - 2024. All rights reserved.