保存包含位图的对象

时间:2016-01-07 18:33:27

标签: android serialization bitmap gson

我正在开发一个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 
}

2 个答案:

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