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. Это может быть ваш код, но я очень сомневаюсь.