2016-01-07 3 views
0

Я работаю над приложением 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

Обратите внимание, что я использовал Parcelable передать книги объектов между различными видами деятельности, поэтому я реализовал Parcelable в классе книги –

+0

, так как вы генерируете растровые изображения? что из ссылки? – Sishin

+0

Да, растровое изображение и другая информация о книге все извлечены из ссылки –

ответ

1

Не размещайте растровое изображение в sharedpreferences. Сохраните его в файле.

Если вам нужно сохранить битмап, вы можете назначить его статическому полю.

Вы также можете преобразовать его в 64-битной строки .. но это плохой дизайн (и я думаю, что это очень медленный и дорогой операцией!):

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)); 
+0

Итак, в классе книги я должен удалить Bitmap вообще, а вместо этого, после загрузки растрового изображения сжать его и сохранить в виде строки в классе? и тогда, когда я должен использовать его в представлении изображения, я бы сделал операцию декодирования первым? –

+0

Это очень дорогой способ сделать это. Быстрее было бы сохранить вещь. SharedPreferences ...на самом деле не предназначен для этого – lawonga

+0

Как его сохранить? это была моя оригинальная проблема. И насколько это дорого или медленно? –

1

Используйте Пикассо и загрузить URLs непосредственно вместо загрузки и сохранения в качестве растрового изображения

Picasso.with(mContext) 
         .load("imageURL here") 
         .placeholder(R.drawable.default_pic) 
         .error(R.drawable.error_pic) 

         .resizeDimen(100, 100) 
         .centerCrop() 
         .into(holderOrderHistory.mIcon); 
Смежные вопросы