【问题标题】:I'm getting GoogleMap.clear on a null object reference我在空对象引用上得到 GoogleMap.clear
【发布时间】:2019-05-04 07:48:24
【问题描述】:

我有一个基于 Google Maps 的应用程序,它使用方法 getMap(),现在使用新模型 getMapAsync,当我想清除或一般使用 GoogleMap 对象时遇到了麻烦,

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void com.google.android.gms.maps.GoogleMap.clear()”。

我正在使用片段。

  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_passenger_page1,
                container, false);
        MapFragment fm = (MapFragment) mainActivity.getFragmentManager().findFragmentById(R.id.map);
        fm.getMapAsync(this);
...
}

问题出在我使用的时候:

   @Override
    public void onResume() {

mMap.clear();

        if (listMarkers.size() > 0)

        {
            setMarker(listMarkers);
        }
        super.onResume();

    }

App每次打开都会调用这个函数,表示mMap为null。

请帮帮我。

【问题讨论】:

  • mMap 初始化在哪里?我在这段代码中没有看到它。
  • 您遇到了这个问题,因为地图是异步的,这意味着您的 onResume 将在此之前触发,您将获得初始化的地图对象。查看第一个答案,然后在 getMapAsync 完成后使用地图对象。
  • 我实现了在地图准备好后运行的 clear() 函数,我需要这样做,因为我不想每次应用程序打开时都创建地图对象,如果应用程序is onPause 我想保留地图。

标签: android maps


【解决方案1】:

请实现 OnMapReadyCallback 接口并重写

 @Override
 public void onMapReady(GoogleMap googleMap) {
    this.googleMap = googleMap;
    googleMap.clear()
    if (listMarkers.size() > 0)

    {
        setMarker(listMarkers);
    }


 }

并从恢复方法中删除代码

【讨论】:

    【解决方案2】:

    感谢您的 cmets,我通过在 onResume 中调用 clear() 函数解决了我的问题,检查 GoogleMap 是否存在以及是否创建它并传递给 mMap。

     @Override
    public void onResume() {
    
        clear();
        if (listMarkers.size() > 0)
    
        {
            setMarker(listMarkers);
        }
        super.onResume();
    
    }
    

    清除函数如下:

    public void clear() {
    
        GoogleMap gm = createMap();
        if (gm == null) {
            Log.e("clear", "The map is null"); //for testing purposes
            return;
    
        } else {
            Log.e("clear", "The map already exists"); //for testing purposes
            mMap = gm;
            mMap.clear();
        }
    
    
        startLocation = null;
        endLocation = null;
        txtFrom.setText("");
        txtTo.setText("");
    
    }
    

    最后是 createMap():

     private GoogleMap createMap() {
    
        if (mMap != null) {
            Log.e("create", "The map already exists"); // for testing purposes
            return mMap;
        }
        MapFragment fm = (MapFragment) 
        mainActivity.getFragmentManager().findFragmentById(R.id.map);
        try {
            fm.getMapAsync(this);
        } catch (Exception ex) {
            Log.e("Error", ex.getLocalizedMessage());
        }
    
        return null;
    
    }
    

    因此,如果它不存在,我总是会创建一个新的 GoogleMap。

    如果我做错了什么,请不要犹豫告诉我 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2017-01-09
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多