Android 谷歌地图在我从firebase获取数据之前运行,因此它崩溃了
我从firebase获取lat和lng,但它在4月1日后运行,因此当我将coords传递到4月1日时,它崩溃了,因为arraylist什么都没有 我想在数组中加载数据后立即运行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
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)