Target SDK从33升级到34后Yandex MapKit重复启动崩溃问题
问题:升级Target SDK至34后Yandex MapKit重复打开Activity崩溃
将Target SDK从33升级至34后,含地图的Activity出现崩溃。更新MapKit库到最新3.5版本后,首次打开该Activity正常,但再次打开时抛出错误:java.lang.AssertionError: setApiKey() should be called before initialize()
崩溃相关代码片段
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MapKitFactory.setApiKey(getString(R.string.yandex_key)); MapKitFactory.initialize(this); setContentView(R.layout.activity_yandex_map); } @Override protected void onStart() { super.onStart(); mapview.onStart(); MapKitFactory.getInstance().onStart(); updateViews(); } @Override protected void onStop() { super.onStop(); mapview.onStop(); MapKitFactory.getInstance().onStop(); locationManager.removeUpdates(locationListener); locationListener = null; }
堆栈信息
FATAL EXCEPTION: main java.lang.AssertionError: setApiKey() should be called before initialize()! at com.yandex.mapkit.MapKitFactory.setApiKey(MapKitFactory.java:35) at activities.AddressesSearchBoth.onCreate(AddressesSearchBoth.java:101) at android.app.Activity.performCreate(Activity.java:8975) at android.app.Activity.performCreate(Activity.java:8944) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4146) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4322) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2685) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:230) at android.os.Looper.loop(Looper.java:319) at android.app.ActivityThread.main(ActivityThread.java:8919) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
解决方案
问题根源在于MapKit初始化后,第二次调用setApiKey()时,MapKit已处于初始化状态,不允许重复设置API Key。
修改步骤
- 将
MapKitFactory.setApiKey()和MapKitFactory.initialize()移到Application类的onCreate()方法中,确保全局只执行一次初始化,而非在Activity的onCreate()中重复执行。 - Activity中仅保留
MapKitFactory.getInstance().onStart()和onStop()的调用逻辑。
示例:Application类实现
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); // 全局初始化MapKit,仅执行一次 MapKitFactory.setApiKey(getString(R.string.yandex_key)); MapKitFactory.initialize(this); } }
修改后的Activity代码
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_yandex_map); } @Override protected void onStart() { super.onStart(); mapview.onStart(); MapKitFactory.getInstance().onStart(); updateViews(); } @Override protected void onStop() { super.onStop(); mapview.onStop(); MapKitFactory.getInstance().onStop(); locationManager.removeUpdates(locationListener); locationListener = null; }
说明
MapKit的初始化是全局操作,无需在每个Activity中重复执行。将初始化逻辑放在Application类中,可保证整个应用生命周期内仅调用一次setApiKey()和initialize(),彻底避免重复调用引发的断言错误。
内容的提问来源于stack exchange,提问作者Lax xxx
相关产品推荐
相关产品推荐

