谷歌地图在我从 Firebase 获取数据之前运行,因此它崩溃了
Posted
技术标签:
【中文标题】谷歌地图在我从 Firebase 获取数据之前运行,因此它崩溃了【英文标题】:google maps run before i fetch my data from firebase hence it crashed 【发布时间】:2019-11-29 17:10:30 【问题描述】:我从 firebase 获取 lat 和 lng,但它在 onMapReady 之后运行,因此当我将坐标传递给 onMapReady 时它崩溃了,因为 arraylist 什么都没有
我想在我的数据加载到我的数组后运行 onMapReady
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));
谁能帮帮我?
【问题讨论】:
【参考方案1】:我在 datachange 内部调用了 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)
);
【讨论】:
【参考方案2】:你必须异步操作:
-
加载地图中显示的数据
加载显示数据的地图
由于地图依赖于数据,因此只有在数据可用后才开始加载地图。我无法显示如何执行此操作的代码,但您需要进行调用,以连接来自 onDataChange
内的任何调用 onMapReady
,如下所示:
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】:您必须等待谷歌地图加载才能对其执行操作。 在您的情况下,在 onMapReady 中调用 loadMapPins,您当前的 onMapReady 代码将移至 onDataChange 方法的末尾。
【讨论】:
我试过了,但它仍然崩溃我在 onmapready 中调用 loadmappins 我们需要日志才能为您提供帮助。请在您的帖子上分享。 等一下,我把代码改了一点,你能再看一遍,但还是不行 E/androidRuntime:致命异常:主进程:com.teepe.teepe,PID:19923 java.lang.IndexOutOfBoundsException:索引:0,大小:0 在 java.util.ArrayList.get(ArrayList .java:411) 在 com.google.android.gms.maps.zzak.zza(Unknown Source) 在 com.google.android.gms.maps 在 com.teepe.teepe.insideHostelList.onMapReady(insideHostelList.java:468) .internal.zzaq.dispatchTransaction(未知来源)以上是关于谷歌地图在我从 Firebase 获取数据之前运行,因此它崩溃了的主要内容,如果未能解决你的问题,请参考以下文章