2014-01-10 6 views
0

Извините за мой плохой английский. В моем приложении я использую ImmutableMap из библиотеки Guava для хранения некоторых ключей и значений. Когда я нажимаю кнопку «домой», а затем снова открываю приложение, он падает, а logcat говорит, что на карте есть повторяющиеся значения. Это потому, что я заполняю карту в начале MainActivity. Возможно ли как-то узнать, если MainActivity уже существует и не заполнять его?Ошибка приложения при повторном открытии (ImmutableMap)

Одно решение: Единственным обходным решением, которое я вижу, является проверка размера карты, а если она равна нулю, заполните ее.

EDIT: Отображаются повторяющиеся значения, поскольку карта заполняется при первом запуске, а затем, после перезапуска активности, она пытается снова заполнить их, причиняя ошибку.
Код:

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 
+0

Вы можете оставить logcat – Martin

+0

Вы реализовали как onStart, так и onResume? – ItayB

+0

Нет, не знаю, не так ли? – Groosha

ответ

2

Я предполагаю, что ваша карта является Статическая карта. Итак, каждый раз, когда вы входите в обратный вызов onCreate(...), вы пытаетесь заполнить карту, которая не может быть изменена.

Если вы указали documentation of Activity, есть несколько причин, по которым вызывается функция onCreate (...).

Лучшим решением будет объявление вашей карты в объект Application, который позволит вам выполнить инициализацию вашей карты.

  1. Обеспечение поглотитель для карты в только что созданный класс
  2. справочном Заявка на ваш AndroidManifest.xml
  3. В вашей деятельности получить приложение и безопасно бросить его YourApplication.class
+0

Спасибо, я посмотрю на это. – Groosha

Смежные вопросы