Android地图在启动活动中加载非常慢/未加载,直到点击它为止

时间:2015-10-02 14:04:34

标签: android google-maps

当开始新的地图活动时,地图加载速度非常慢,并且在点击屏幕之前不会开始加载。

布局如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.android.momintuition.DirectionsActivity">

    <com.google.android.gms.maps.MapView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:id="@+id/mapView"
        android:paddingTop="62px"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        map:uiCompass="true"
        map:zOrderOnTop="true"
        map:uiZoomControls="true"
        android:background="#00000000" />
</RelativeLayout>

新活动如下:

public class DirectionsActivity extends AppCompatActivity implements OnMapReadyCallback {


    GoogleMap mMap; // Might be null if Google Play services APK is not available.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_directions);
        MapView mv = (MapView) findViewById(R.id.mapView);
        mv.onCreate(savedInstanceState);
        mMap = mv.getMapAsync(this);

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
         this.map = googleMap;
         CameraUpdate cameraUpdate =
                                CameraUpdateFactory.newLatLngZoom(new LatLng(43.1, -87.9), 10);
         map.animateCamera(cameraUpdate);
    }
}

我是Android新手。我错过了什么吗?谢谢!

2 个答案:

答案 0 :(得分:15)

在这种情况下的问题是我没有实现以下方法(即使它在文档中指定):

    @Override
    public void onResume() {
        mapView.onResume();
        super.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

这对我来说是违反直觉的,为什么这些方法可能会影响显示地图,但确实可以解决问题。

答案 1 :(得分:3)

TL; DR这些行使我的地图加载。

itemMap.onResume();
mapView.onEnterAmbient(null);

对于遇到同样问题的人:

我在RecyclerView中使用地图,我遇到了同样的问题,所以我通过使用MapView类型的ArrayList来实现racula的答案,并且我会在初始化时将mapView添加到列表中。

在Activity Lifecycle方法中,我将从适配器获取mapViewList,并调用适当的方法。现在,当我恢复应用程序时,地图正在加载。

    //In the Activity
    @Override
    protected void onResume() {
        super.onResume();
        for(MapView mapView : adapter.getMapViewList()){
            if (mapView != null){                   
                mapView.onResume();
            }              
        }
    }

所以最后我测试了一些东西,并添加了“itemMap.onResume();”和“mapView.onEnterAmbient(null);”方法,地图开始加载和工作就好了。 这是我的Adapter类的简单版本

//RecyclerView Adapter and inside it the ViewHolder
class ReminderAdapter extends RecyclerView.Adapter<ReminderAdapter.MyViewHolder> {

    private ArrayList<MapView> mapViewList;

    @Override
    public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_layout, parent, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final ReminderAdapter.MyViewHolder holder, int position) {
        (...)
        holder.initializeMapView(new LatLng(getLat(), getLng()));
    }   

    ArrayList<MapView> getMapViewList(){
        return mapViewList;
    }     

    (...)

    class MyViewHolder extends RecyclerView.ViewHolder implements OnMapReadyCallback{

    @Override
        public void onMapReady(GoogleMap googleMap) {
            MapsInitializer.initialize(context);
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15f));
            googleMap.addMarker(new MarkerOptions().position(latLng));
            this.googleMap = googleMap;
            itemMap.onResume();           //The methods
            itemMap.onEnterAmbient(null); // that made my map work
        }

        void initializeMapView(LatLng latLng){
            if(itemMap != null){             
                this.latLng = latLng;
                itemMap.onCreate(bundle);
                itemMap.getMapAsync(this);
                mapViewList.add(itemMap); // adds the MapView to the list
            }
        }
    }
}