我试图在偏好中保存列表数据
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字节)
答案 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
}
只需创建简单的模型类。不需要包裹..