我在 onStart() 方法上得到地图对象 null

Posted

技术标签:

【中文标题】我在 onStart() 方法上得到地图对象 null【英文标题】:I get map object null on onStart() method 【发布时间】:2022-01-19 07:48:24 【问题描述】:

我在打开片段时尝试添加标记,因此在 onMap Ready 函数中我分配了我的地图,我正在调用 map onStart() 方法,但我得到了 null

@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) 
    map = mapboxMap;


@Override
public void onStart() 
    super.onStart();
    mapView.onStart();
    Bundle args = getArguments();
    if (args != null) 
        System.out.println("MY PATROL => "+args);
        mapboxAddMarker(args.getString("QRResult"));
    


public void mapboxAddMarker(String coords)
    String[] coordArr =coords.split(" ");

    LatLng coord = new LatLng();
    coord.setLatitude(Double.parseDouble(coordArr[0]));
    coord.setLongitude(Double.parseDouble(coordArr[1]));

    map.addMarker(new MarkerOptions().position(coord));

另外,我知道 addMarker 已被弃用,但这是一个我会修复它的示例。

最后是我的错误

E/androidRuntime: FATAL EXCEPTION: main
    Process: com.example.rtets, PID: 10727
    java.lang.NullPointerException: Attempt to invoke virtual method 'com.mapbox.mapboxsdk.annotations.Marker com.mapbox.mapboxsdk.maps.MapboxMap.addMarker(com.mapbox.mapboxsdk.annotations.MarkerOptions)' on a null object reference
        at com.example.rtets.ui.fragments.MyPatrolFragment.mapboxAddMarker(MyPatrolFragment.java:83)
        at com.example.rtets.ui.fragments.MyPatrolFragment.onViewCreated(MyPatrolFragment.java:96)
        at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8633)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

【问题讨论】:

你调试过你的代码吗?你确定 onMapReady 被调用了吗? 是的,我什至没有打电话 所以有你的问题。您需要在 onStart 中实例化地图 我无法在 onStart 中实例化地图,因为我需要 MapboxMap 对象,但我只能在 onMapReady 函数中获取此对象 我搜索了此错误,他们说您忘记调用 getMapAsync 但我没有在 onCreateView 中调用它并且它有效 如果 onMapReady 根本没有被调用,那么你应该发布 sn-p 负责初始化地图 (onCreate?) 【参考方案1】:

您根本无法确定在调用Activitys 生命周期回调之前会调用onMapReady(如onStartonResume)。地图初始化是异步操作,因此您必须在准备好时传递回调以获取信息(就像方法说的那样)。你应该在onMapReady中初始化你的标记

【讨论】:

也许我想在 onMapReady 10 秒后添加标记或类似的东西有什么方法可以在 onMapReady 之外添加Marker 或 SetStyle 您可以随时添加,也可以在onStart 中添加,有可能在onStart 之前在某些快速设备上加载(调用onMapReady)并且您当前的代码将起作用。但是您必须始终注意map 引用可能是null,因为地图可能会在几秒钟内初始化,甚至从不初始化。因此,在正确初始化(onMapReady 调用)之后添加持久标记(来自捆绑包),之后您可以随时使用map 对象(只要Activity/Fragment 正在运行) 是的,但即使检查空控制,我如何处理空地图情况作为结论,我的地图为空,我想用地图做的事情无法完成 好吧,只是不要做“地图的东西”,而是显示一些提示用户地图无法加载的启动画面。您可以从onCreate 开始引入自己的计时器并触发例如5 秒后检查地图是否正确初始化。如果不使用适当的信息进行一些 UI 回退,如果是,则启用与地图相关的功能/GUI。标记应在地图加载后立即加载,因此在 onMapReady【参考方案2】:

我解决了我的问题我实现了我的片段OnMapReadyCallback

并覆盖它,但我认为在片段中不起作用,所以我删除了OnMapReadyCallback 并在getMapAsync 方法中写了OnMapReadyCallback

mapView.getMapAsync(new OnMapReadyCallback() 
        @Override
        public void onMapReady(@NonNull MapboxMap mapboxMap) 
            System.out.println("MAP IS OKAY");
        
    );

【讨论】:

以上是关于我在 onStart() 方法上得到地图对象 null的主要内容,如果未能解决你的问题,请参考以下文章

尝试在空对象引用上调用虚方法 - 如何正确更改TextView的值

AndroidX 迁移后,ListView 未在 OnCreate/OnStart 上显示任何数据

Play Framework 2.4 - 依赖注入替换 GlobalSettings.onStart()

在 onActivityCreated/onStart/onViewCreated 方法内的 getView() 上出现 NullPointerException 警告

在某些 Android 设备上获取 nullPointerException onStart() 方法

getHeight 为所有 Android UI 对象返回 0