0

Im wanted to save a object from my class which has the package names etc. . So I tried to find a solution to save this object through SharedPreferences and found out that I can make this Object to a JSON String with the Gson class. But the first try failed. Im getting a Error by converting it . I also debugged step by step and found the line :

String jsonapp = gson.toJson(installed_apps);

Here's the whole code :

    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);

And here is my class :

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

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

Crash Report :

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

Why do I get this error and whats the solution for it ? Any ideas ? Thank You !

2
  • 1
    This is probably caused due to the Drawable. You can't convert a drawable to json. What you can do is save the drawable to local storage, and only save the file name as a string in AppInfo. Commented Nov 25, 2014 at 19:50
  • Thank you very much that was it ... This class is very old and I actually forgot it :) Thanks ! Commented Nov 25, 2014 at 19:57

2 Answers 2

2

Are you serializing the Drawable? I'm not positive but it seems like this could be causing your problem. Have you tried removing the Drawable field from your class?

I would save the Drawable as an image to the file system and save a string representation of its path.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much ! I forgot that my class has a drawable var.
0

Your loop condition for(int i=0;i<apps.size();i++) says "loop through this list until you get to the end of it". Inside the loop you are adding items to the list so that you never actually reach the end of it hence the stackoverflow.

In Java when you declare a loop in this way the function apps.size() gets called each time the loop iterates. It's good practice to first of all declare an integer and assign it the value of the array length and then loop through the array this way. Not only does this mean that you are guaranteed to only loop through the list a finite number of times but it also encourages you to write code more efficiently. An example of the loop would be

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

1 Comment

He's adding to installed_apps, not apps.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.