【问题标题】:App crash when re-opened (ImmutableMap)重新打开时应用程序崩溃(ImmutableMap)
【发布时间】:2014-01-30 01:23:15
【问题描述】:

对不起,我的英语不好。 在我的应用程序中,我使用来自 Guava 库的 ImmutableMap 来存储一些键和值。 当我按下主页按钮然后重新打开应用程序时它崩溃并且 logcat 说地图中有重复的值。 那是因为我在 MainActivity 开始时填充了地图。 是否有可能以某种方式找出 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

【问题讨论】:

  • 你能发布你的logcat吗
  • 你是否同时实现了 onStart 和 onResume?
  • 不,我没有,应该吗?
  • 发布您的主要活动
  • 好的,我已经编辑了帖子

标签: android map android-activity lifecycle


【解决方案1】:

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

如果您检查documentation of Activity,则调用 onCreate(...) 的原因有多种。

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

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

【讨论】:

  • 谢谢,我会调查一下。
猜你喜欢
  • 2018-10-07
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多