将列表保存到android活动中的SharedPreferences

时间:2017-06-08 09:20:43

标签: android android-activity gson sharedpreferences

我试图在偏好中保存列表数据

List<AppGrid> mArrayProducts = new ArrayList<AppGrid>();
Gson gson = new Gson();
            String jsonObject = gson.toJson(mArrayProducts);
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
            SharedPreferences.Editor editor = preferences.edit();
            editor.putString("MyObject", jsonObject);
            editor.commit();
            Intent intent = new Intent(InstalledAppActivity.this,MainActivity.class);
            startActivity(intent); 
  

AppGrid.java

private String dataDir;
private Drawable icon;
private String id;
private String name;
private String launcherName;
private String packageName;
private int pageIndex;
private int position;
private boolean sysApp;
public boolean selected;
public AppGrid() {

}


public AppGrid(Drawable icon, String title, String packageName) {
    this.icon = icon;
    this.name = title;
    this.packageName = packageName;
}
protected AppGrid(Parcel in) {
    name = in.readString();
    packageName = in.readString();
    selected = in.readByte() != 0;
}


public String getDataDir() {
    return this.dataDir;
}

public Drawable getIcon() {
    return this.icon;
}

public String getId() {
    return this.id;
}

public String getName() {
    return this.name;
}

public String getPackageName() {
    return this.packageName;
}

public int getPageIndex() {
    return this.pageIndex;
}

public int getPosition() {
    return this.position;
}

public void setDataDir(String paramString) {
    this.dataDir = paramString;
}

public void setIcon(Drawable paramDrawable) {
    this.icon = paramDrawable;
}

public void setId(String paramString) {
    this.id = paramString;
}

public void setName(String paramString) {
    this.name = paramString;
}

public void setPackageName(String paramString) {
    this.packageName = paramString;
}

public void setPageIndex(int paramInt) {
    this.pageIndex = paramInt;
}

public void setPosition(int paramInt) {
    this.position = paramInt;
}

public String toString() {
    return "AppGrid [packageName=" + this.packageName + ", name=" + this.name + ", icon=" + this.icon + ", dataDir=" + this.dataDir + "]";
}

public boolean isSysApp() {
    return sysApp;
}

public void setSysApp(boolean sysApp) {
    this.sysApp = sysApp;
}

public String getLauncherName() {
    return launcherName;
}

public void setLauncherName(String launcherName) {
    this.launcherName = launcherName;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(name);
    parcel.writeString(packageName);
   /* Bitmap bitmap = (Bitmap)((BitmapDrawable) icon ).getBitmap();
    parcel.writeParcelable(bitmap, i);*/
    parcel.writeByte((byte) (selected ? 1 : 0));
}
public boolean isSelected() {
    return selected;
}
public void setSelected(boolean selected) {
    this.selected = selected;
}

public static final Creator<AppGrid> CREATOR = new Creator<AppGrid>() {
    @Override
    public AppGrid createFromParcel(Parcel in) {
        return new AppGrid(in);
    }

    @Override
    public AppGrid[] newArray(int size) {
        return new AppGrid[size];
    }
};

}

数据未保存在共享首选项中。请您帮助我

logcat的:

  

D /错误:错误:stack = java.lang.OutOfMemoryError:无法分配   16字节分配,4194272个空闲字节,4MB直到OOM;失败   由于碎片(需要一个新的免费4096字节   缓冲区,其中最大的连续空闲0字节)

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试保存一个非常大的值。 SharedPreferences不用于存储数据。它只存储简单的数据。它旨在存储小的键值对,例如设置,用户名,ID,选项等。

从技术上讲,所有共享首选项都存储在/ data / data / [package name] / shared_prefs / [app name] .xml中,所以我认为没有基于体系结构的限制。

但有些设备可能在此问题上遇到困难和性能问题。因此,对于少数设备,基本上存在SharedPreference数据的限制

因此,当您需要处理大量数据时,最好使用SQLite数据库。

修改

如果我没弄错的话,你试图存储可绘制的图标,这可能导致存储大字节。最佳实践只是存储drawable的ID ..

public class AppGrid {

    private String dataDir;
    private int Drawableicon;
    private String id;
    private String name;
    private String launcherName;
    private String packageName;
    private int pageIndex;
    private int position;
    private boolean sysApp;
    public boolean selected;


    public AppGrid(@drawable int icon, String title, String packageName) {
        this.Drawableicon = icon;
        this.name = title;
        this.packageName = packageName;
    }

    //setter and getter
}

只需创建简单的模型类。不需要包裹..