我正在开发一个Android应用程序(第一个应用程序初学者),当我再次加载应用程序时,我试图保存数据。
我想要存储的数据是书籍列表,每本书都包含信息(作者,日期等)和包含书籍图片的位图。我尝试使用GSON将列表转换为JSON并存储在SharedPreferences中,但由于位图而导致问题。
应用程序启动时,如何保存文件并再次检索?
这是代码的简要版本
图书馆类
public class Library {
private ArrayList<Entry> library ;
public Library () {
library = new ArrayList<Entry>();
}
public void addEntry( Entry entry ) {
library.add(entry);
}
public void removeEntry ( Entry entry ) {
if (library.contains(entry))
library.remove(entry);
else Log.d ( "Library" , "Entry Not Found");
}
public ArrayList<Entry> getLibrary() {
return library;
}
@Override
public String toString() {
return "Library{" +
"library=" + library +
'}';
}
}
条目类
public class Entry {
Book book ;
final LocalDate borrowDate;
LocalDate dueDate;
//some methods for application
}
图书类
public class Book implements Parcelable {
private String title;
private String author;
private String isbn ;
private double rating;
private int ratingCount;
private int pageCount;
private transient Bitmap image;
private String overview;
//some methods
}
答案 0 :(得分:2)
使用Picasso直接加载网址,而不是下载并保存为位图
Picasso.with(mContext)
.load("imageURL here")
.placeholder(R.drawable.default_pic)
.error(R.drawable.error_pic)
.resizeDimen(100, 100)
.centerCrop()
.into(holderOrderHistory.mIcon);
答案 1 :(得分:1)
不要将位图放在共享偏好中。将其保存在文件中。
如果需要保留位图,可以将其分配给静态字段。
您也可以将它转换为64位字符串..但这是糟糕的设计(我认为这是一个非常缓慢和昂贵的操作!):</ p>
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); //bm is the bitmap object
byte[] b = baos.toByteArray();
String encoded = Base64.encodeToString(b, Base64.DEFAULT);
^将其保存到SharedPreferece。现在解码:
byte[] imageAsBytes = Base64.decode(encoded.getBytes());
ImageView image = (ImageView)this.findViewById(R.id.ImageView);
image.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length));