【问题标题】:Save List to SharedPreferences in android activity将列表保存到 android 活动中的 SharedPreferences
【发布时间】:2017-11-09 22:14:30
【问题描述】:

我正在尝试将列表数据保存在首选项中

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/Error: ERR: stack=java.lang.OutOfMemoryError: 无法分配一个 16 字节分配,4194272 空闲字节和 4MB 直到 OOM;失败的 由于碎片(需要连续的空闲 4096 字节来获取新的 缓冲区,其中最大的连续空闲 0 字节)

【问题讨论】:

  • 列表的大小是多少?
  • AppGrid 类包含什么类型的数据?
  • 我已经添加了 AppGrid.calss ,你能找到吗
  • 我认为你正在保存 Drawable,所以你得到了 OutOfMemory Eexcption。尝试将图像路径保存在 Sharedpreference 而不是图像中。

标签: android android-activity gson sharedpreferences


【解决方案1】:

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

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

但有些设备在这方面可能会遇到困难和性能问题。因此,对于少数设备而言,SharedPreference 数据基本上存在局限性

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

编辑

如果我没记错的话,您正在尝试存储可能导致存储大字节的可绘制图标。最佳做法是仅存储可绘制对象的 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
}

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

【讨论】:

  • 在此之前我使用过 sqlite 但问题是,如果用户卸载喜欢的应用程序,仍然显示该应用程序,因为该应用程序信息仍在 sqlite 中。所以现在我使用共享首选项。我走正确的路??你能指导我吗。stackoverflow.com/questions/44305935/…
猜你喜欢
  • 2020-11-28
  • 2016-06-23
  • 2016-06-15
  • 2019-05-28
  • 2017-12-06
  • 2021-11-11
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多