我在 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】:
您根本无法确定在调用Activity
s 生命周期回调之前会调用onMapReady
(如onStart
或onResume
)。地图初始化是异步操作,因此您必须在准备好时传递回调以获取信息(就像方法说的那样)。你应该在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 警告