google maps run before i fetch my data from firebase hence it crashed

匆匆过客 提交于 2020-05-17 08:11:33

问题


Im fetching lat and lng from firebase but it runs after onMapReady hence when i pass coords to onMapReady it crashed beacause arraylist has nothing

I want to run onMapReady after my data is loaded in my arrays

private void loadMapPins(){
    Query q = FirebaseDatabase.getInstance().getReference("HOSTELS").orderByChild("LOCATION_ID").equalTo(hostelID);
    q.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        for(DataSnapshot childsnap:dataSnapshot.getChildren()){
            LatAndLng latAndLng = childsnap.child("MAP_LOCATION").getValue(LatAndLng.class);
            lat.add(String.valueOf(latAndLng.getLATITUDE()));
            lng.add(String.valueOf(latAndLng.getLONGITUDE() ));
            Log.d("latitudess", "onDataChange: "+String.valueOf(latAndLng.getLATITUDE()));
        }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}





@Override
public void onMapReady(GoogleMap googleMap) {

        LatLng sydney = new LatLng(lat.get(0), lng.get(0));
        googleMap.addMarker(new MarkerOptions().position(sydney)
                .title("Marker in Sydney"));
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney,15f));




}

 @Override
public void onMapReady(GoogleMap googleMap) {

    loadMapPins();

   LatLng sydney = new LatLng(Float.parseFloat(lat.get(0)), Float.parseFloat(lng.get(0)));
    googleMap.addMarker(new MarkerOptions().position(sydney));

    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney,15f));
}

Can anyone help me out?


回答1:


I called the on map ready inside on datachange so that whenever i got dta onMapReady runs after that only

 @Override
public void onMapReady(GoogleMap googleMap) {

    Query q = FirebaseDatabase.getInstance().getReference("HOSTELS").orderByChild("LOCATION_ID").equalTo(hostelID);
    q.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for(DataSnapshot childsnap:dataSnapshot.getChildren()){
                LatAndLng latAndLng = childsnap.child("MAP_LOCATION").getValue(LatAndLng.class);
                lat.add(String.valueOf(latAndLng.getLATITUDE()));
                lng.add(String.valueOf(latAndLng.getLONGITUDE() ));
                Log.d("latitudess", "onDataChange: "+String.valueOf(latAndLng.getLATITUDE()));
            }

            LatLng sydney = new LatLng(Float.parseFloat(lat.get(0)), Float.parseFloat(lng.get(0)));
            googleMap.addMarker(new MarkerOptions().position(sydney));

            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney,15f));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });



回答2:


You have to asynchronous actions:

  1. Loading the data that is displayed in the map
  2. Loading the map that displays the data

Since the map is dependent on the data, you should only start loading the map once the data is available. I can't show the code of how to do this, but you'll need to make the call that wires up whatever calls onMapReady from within onDataChange with something like:

mapRef=FirebaseDatabase.getInstance().getReference().child("HOSTELS").child(hostelID).child("MAP_LOCATION");
mapRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        Inside_location inside_location=dataSnapshot.getValue(Inside_location.class);
        lat.add(Double.valueOf(inside_location.getLATITUDE()) );
        lng.add(Double.valueOf(inside_location.getLONGITUDE())) ;

        // TODO: start loading the map based on the lat and lng
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});



回答3:


You must wait google map for load to do actions over it. In your case, call loadMapPins in onMapReady and your current onMapReady code move to the end of onDataChange method.



来源:https://stackoverflow.com/questions/57133926/google-maps-run-before-i-fetch-my-data-from-firebase-hence-it-crashed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!