Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 谷歌地图在我从firebase获取数据之前运行,因此它崩溃了_Android_Firebase_Google Maps_Firebase Realtime Database - Fatal编程技术网

Android 谷歌地图在我从firebase获取数据之前运行,因此它崩溃了

Android 谷歌地图在我从firebase获取数据之前运行,因此它崩溃了,android,firebase,google-maps,firebase-realtime-database,Android,Firebase,Google Maps,Firebase Realtime Database,我从firebase获取lat和lng,但它在4月1日后运行,因此当我将coords传递到4月1日时,它崩溃了,因为arraylist什么都没有 我想在数组中加载数据后立即运行 private void loadMapPins(){ Query q = FirebaseDatabase.getInstance().getReference("HOSTELS").orderByChild("LOCATION_ID").equalTo(hostelID); q.addValueEve

我从firebase获取lat和lng,但它在4月1日后运行,因此当我将coords传递到4月1日时,它崩溃了,因为arraylist什么都没有

我想在数组中加载数据后立即运行

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));
}

有人能帮我吗?

您必须执行异步操作:

  • 加载地图中显示的数据
  • 加载显示数据的地图
  • 由于映射依赖于数据,因此仅应在数据可用时才开始加载映射。我无法显示如何执行此操作的代码,但您需要进行调用,将
    onMapReady
    内的
    onDataChange
    调用连接起来,例如:

    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
        }
    });
    

    您必须等待GoogleMap加载才能对其执行操作。
    在您的情况下,在onMapReady中调用loadMapPins,您当前的onMapReady代码移动到onDataChange方法的末尾。

    我在onDataChange中调用了on-map ready,这样每当我得到dta时,onMapReady都会在这之后运行

     @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) {
    
            }
        });
    

    我试过了,但还是死机了。我在一个月内调用loadmappins。我们需要日志,以便您帮助您。请在您的帖子上分享它。等等,我对代码做了一些更改,您能再次看到吗,但仍然不起作用inge/AndroidRuntime:FATAL EXCEPTION:main Process:com.teepe.teepe,PID:19923 java.lang.IndexOutOfBoundsException:Index:0,Size:0 at java.util.ArrayList.get(ArrayList.java:411)com.google.android.gms.maps.internal.zzaq.dispatchTransaction(未知源)上的com.google.android.gms.maps.zzak.zza(未知源)上的com.teepe.teepe.insideHostelList.onMapReady(insideHostelList.java:468)