重新打开时应用程序崩溃(ImmutableMap)

时间:2014-01-10 21:47:45

标签: android map android-activity lifecycle

抱歉我的英语不好。 在我的应用程序中,我使用Guava库中的ImmutableMap来存储一些键和值。 当我按下主页按钮,然后重新打开应用程序时崩溃,logcat说地图中有重复的值。 那是因为我在MainActivity start上填充了地图。 是否可能以某种方式找出,如果MainActivity已经存在而不是填充它?

一个解决方案:我看到的唯一解决方法是检查地图的大小,如果它为空,则填写它。

编辑:显示重复值,因为地图在首次启动时已填充,然后,在活动重启后,它会尝试再次填充它们,导致错误。
代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.main);         
        Map.map_fill();
....
}

logcat的:

01-11 01:56:31.970: D/AndroidRuntime(30500): Shutting down VM
01-11 01:56:31.970: W/dalvikvm(30500): threadid=1: thread exiting with uncaught exception (group=0x41864ba8)
E/AndroidRuntime(30500): FATAL EXCEPTION: main
E/AndroidRuntime(30500): Process: ru.mastergroosha.idneval2, PID: 30500
E/AndroidRuntime(30500): java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.mastergroosha.idneval2/ru.mastergroosha.idneval2.MainActivity}: java.lang.IllegalArgumentException: Multiple entries with same key: 01=Веригин Вадим Сергеевич and 01=Веригин Вадим Сергеевич
E/AndroidRuntime(30500):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
E/AndroidRuntime(30500):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2248)
E/AndroidRuntime(30500):    at android.app.ActivityThread.access$800(ActivityThread.java:138)
E/AndroidRuntime(30500):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
E/AndroidRuntime(30500):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(30500):    at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime(30500):    at android.app.ActivityThread.main(ActivityThread.java:5050)
E/AndroidRuntime(30500):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(30500):    at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(30500):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
E/AndroidRuntime(30500):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
E/AndroidRuntime(30500):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(30500): Caused by: java.lang.IllegalArgumentException: Multiple entries with same key: 01=Веригин Вадим Сергеевич and 01=Веригин Вадим Сергеевич
E/AndroidRuntime(30500):    at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:150)
E/AndroidRuntime(30500):    at com.google.common.collect.RegularImmutableBiMap.<init>(RegularImmutableBiMap.java:77)
E/AndroidRuntime(30500):    at com.google.common.collect.ImmutableBiMap$Builder.build(ImmutableBiMap.java:172)
E/AndroidRuntime(30500):    at ru.mastergroosha.idneval2.Map.make_names_array(Map.java:77)
E/AndroidRuntime(30500):    at ru.mastergroosha.idneval2.MainActivity.onCreate(MainActivity.java:114)
E/AndroidRuntime(30500):    at android.app.Activity.performCreate(Activity.java:5241)
E/AndroidRuntime(30500):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime(30500):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
E/AndroidRuntime(30500):    ... 11 more

1 个答案:

答案 0 :(得分:2)

我猜你的地图是静态地图。 因此,每次进入onCreate(...)回调时,都会尝试填写无法修改的地图。

如果你检查documentation of Activity,有几个原因可以调用onCreate(...)。

更好的解决方案是将您的地图声明为Application对象,以便您可以对地图进行初始化。

  1. 在刚刚创建的课程中为您的地图提供一个getter
  2. 将应用程序引用到AndroidManifest.xml
  3. 在您的活动中获取应用程序并将其安全地转换为YourApplication.class