谷歌地图在我从 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 获取数据之前运行,因此它崩溃了的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用新地图刷新之前清除谷歌地图标记? [复制]

从 Firebase 检索位置并将标记放在谷歌地图上

谷歌地图和亚马逊应用商店

如何在谷歌地图android上设置多个标记?

如何在flutter中将标记从firebase(真实数据库)检索到新的google maps api

在谷歌地图标记上显示信息