2014-11-25 2 views
0

Мне захотелось сохранить объект из моего класса, который имеет имена пакетов и т. Д. Поэтому я попытался найти решение для сохранения этого объекта через SharedPreferences и выяснил, что могу сделать этот объект строкой JSON с классом Gson. Но первая попытка не удалась. Я получаю ошибку, преобразовывая ее. Я также отлаживал шаг за шагом и нашел строку:Ошибка при использовании класса Gson [STACKOVERFLOW ERROR]

String jsonapp = gson.toJson (installed_apps);

Вот весь код:

List<PackageInfo> apps; 
    List<AppInfo> installed_apps; 
    ... 
      apps = getPackageManager().getInstalledPackages(0); 
      installed_apps = new ArrayList<AppInfo>(); 

       for(int i=0;i<apps.size();i++) 
       { 
           PackageInfo p = apps.get(i); 
           AppInfo newInfo = new AppInfo(); 
           newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString(); 
           newInfo.pname = p.packageName; 
           newInfo.versionName = p.versionName; 
           newInfo.versionCode = p.versionCode; 
           newInfo.icon = p.applicationInfo.loadIcon(getPackageManager()); 
           installed_apps.add(newInfo); 
       } 

       Gson gson = new Gson(); 
       String jsonapp = gson.toJson(installed_apps); 

А вот мой класс:

class AppInfo { 
     String appname = ""; 
     String pname = ""; 
     String versionName = ""; 
     int versionCode = 0; 
     Drawable icon; 

     public String get_appname() { 
      return appname; 
     } 
    }; 

Краш Доклад:

11-25 20:20:20.911: E/AndroidRuntime(21989): FATAL EXCEPTION: main 
11-25 20:20:20.911: E/AndroidRuntime(21989): Process: com.ronssoft.JewE_lite, PID: 21989 
11-25 20:20:20.911: E/AndroidRuntime(21989): java.lang.StackOverflowError 
11-25 20:20:20.911: E/AndroidRuntime(21989): at java.lang.Class.isArray(Class.java:1118) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:331) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:380) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:375) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:355) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:117) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.Gson.getAdapter(Gson.java:356) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(ReflectiveTypeAdapterFactory.java:82) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:81) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:118) 
11-25 20:20:20.911: E/AndroidRuntime(21989): at com.google.gson.internal.bind.R 

Почему я получаю эту ошибку и Будет решение для этого? Есть идеи ? Спасибо !

+1

Возможно, это связано с помощью Drawable. Вы не можете преобразовать drawable в json. Что вы можете сделать, так это сохранить выделение для локального хранилища и сохранить имя файла в виде строки в AppInfo. – Eran

+0

Спасибо, что это было ... Этот класс очень старый, и я на самом деле забыл его :) Спасибо! –

ответ

2

Вы сериализуете Drawable? Я не уверен, но похоже, что это может вызвать проблемы. Вы пытались удалить поле Drawable из своего класса?

Я бы сохранил Drawable как изображение в файловой системе и сохранил строковое представление своего пути.

+0

Большое спасибо! Я забыл, что у моего класса есть drawable var. –

0

Ваше условие цикла for(int i=0;i<apps.size();i++) говорит: «Пройдите через этот список, пока не дойдете до конца». Внутри цикла вы добавляете элементы в список, чтобы вы никогда не достигали конца его, следовательно, stackoverflow.

В Java, когда вы объявляете цикл таким образом, функция apps.size() вызывается каждый раз, когда цикл выполняет итерацию. Хорошей практикой является, прежде всего, объявить целое число и присвоить ему значение длины массива, а затем выполнить цикл через массив. Это означает не только то, что вам гарантировано только циклическое переключение по списку за конечное количество раз, но оно также побуждает вас писать код более эффективно. Примером цикла будет

int size = apps.size(); 
    for(int i=0;i<size;i++) { 
    do stuff..... 
    } 
+0

Он добавляет к 'installed_apps', а не' apps'. –

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