Intereting Posts
Полный экран в настройке темы Проверьте, является ли строка числом Как открыть приложение Google Play Store напрямую без намерений Android ListView с элементами, доступными для кликов в его рядах, вызывает проблемы с продолжением прокрутки ViewPager и OnItemClickListener в ListView Должен ли я заменить ActionBarActivity на AppCompatActivity? Получить адрес электронной почты и номер телефона, на котором используется метка типа android Как изменить цвет дочернего разделителя ExpanableListView по файлу xml-макета? Альтернатива вложенным весам с помощью LinearLayouts Снизьте Xamarin.Android Как позвонить в список контактов Android И выбрать один номер телефона на экране своих данных? Как установить тип шрифта в webview Как полностью отключить мягкую клавиатуру для всех входных данных в веб-браузере Android Android recyclerView findViewHolderForAdapterPosition возвращает null Bouncy Castle Keystore (BKS): java.io.IOException: неправильная версия хранилища ключей

Gson 2.2.2, вызывающий переполнение стека только на 4.2.1

Я разрабатываю приложение для Android, которое загружает точки интереса с сервера, используя строки JSON. Все работает нормально, но с тех пор, как я начал тестировать на 4.2.1, я получаю следующую ошибку:

01-28 15:32:14.167: E/AndroidRuntime(31174): FATAL EXCEPTION: AsyncTask #1 01-28 15:32:14.167: E/AndroidRuntime(31174): java.lang.RuntimeException: An error occured while executing doInBackground() 01-28 15:32:14.167: E/AndroidRuntime(31174): at android.os.AsyncTask$3.done(AsyncTask.java:299) 01-28 15:32:14.167: E/AndroidRuntime(31174): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 01-28 15:32:14.167: E/AndroidRuntime(31174): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 01-28 15:32:14.167: E/AndroidRuntime(31174): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 01-28 15:32:14.167: E/AndroidRuntime(31174): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 01-28 15:32:14.167: E/AndroidRuntime(31174): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 01-28 15:32:14.167: E/AndroidRuntime(31174): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 01-28 15:32:14.167: E/AndroidRuntime(31174): at java.lang.Thread.run(Thread.java:856) 01-28 15:32:14.167: E/AndroidRuntime(31174): Caused by: java.lang.StackOverflowError 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:371) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:355) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:117) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.Gson.getAdapter(Gson.java:353) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.Gson.getAdapter(Gson.java:353) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.Gson.getAdapter(Gson.java:353) 01-28 15:32:14.167: E/AndroidRuntime(31174): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java: 

Странно то, что он отлично работает на каждой другой версии, которую я пробовал …

Вот строка, я думаю, что она рушится:

  Gson g = new Gson(); JSONResponse jsonResponse = g.fromJson(serverReply, JSONResponse.class); <--- 

И класс, который я пытаюсь создать:

 /** * The JSONResponse from the server * @author Tom * */ public class JSONResponse { private String status; private PointOfInterest result; /** * Creates a JSONResponse object * @param json * @return */ static JSONResponse convertJSONToResponse(String json){ Gson gson = new Gson(); JSONResponse jsonResponse = gson.fromJson(json, JSONResponse.class); return jsonResponse; } /** * Get Point of Interest */ public PointOfInterest getPointofInterest(){ return result; } public String getStatus(){ return status; } /** * Get PrivateSection, area we can put our own data */ /* public String getPrivateSection(){ return privateSection; } */ /** * Creates a JSONResponse object * @param json * @return */ String convertJSONResponseToJSON(){ Gson gson = new Gson(); return gson.toJson(this); } } 

Обратите внимание, что я знаю о страшном шаблоне проектирования, который я использовал здесь, это приложение предназначено для класса мобильных приложений, который я принимаю в колледже, поэтому успокойтесь!

Редактировать Оказывает понижение gson до 1.7.1 работает для меня.

Solutions Collecting From Web of "Gson 2.2.2, вызывающий переполнение стека только на 4.2.1"

Так получилось, что это ошибка, как отметил Эрик Недэндек. Я взял легкий путь и понизил уровень gson с 2.2.2 до 1.7.1 , теперь все работает!

Проверьте этот отчет об ошибке. http://code.google.com/p/google-gson/issues/detail?id=440

Комментарий № 12:

Я считаю, что в интерфейсе API 17 внутренняя часть WeakReference и SoftReference изменилась как самореференция, что могло бы вызвать это. Вы используете Gson для сериализации WeakReference или SoftReference? Если да, вы должны написать свой собственный TypeAdapter для этих типов.

Что-то в вашем коде вызывает круговую ссылку, и поскольку она работает до 4.2.1 (API 17), это, скорее всего, один из классов Java. Это может быть ваш код, но я очень сомневаюсь.