2016-06-23 5 views
0

Я работаю с API-интерфейсом Volley в своих WebServices, а затем буду писать данные с помощью SQLITE.android - Как кэшировать изображение и отображать офлайн?

Веб-службы, которые поставляются с JSON с большим количеством иены, каждый из которых имеет данные и изображение, и мне нужно, чтобы это изображение в моем кеше отображалось в автономном режиме в ListView, а затем на подробном экране. В будущем пользователь очистит эти иены и очистит их воображение.

Хорошо, как я могу сохранить эти изображения в своей локальной базе данных и связываться с каждым элементом, который у меня есть у JSON?

Я буду, в 90% случаев, в автономном режиме. Я буду оставаться в сети только для синхронизации и загрузки обновленных элементов сервера.

+0

Вы можете использовать универсальный погрузчик изображения или Picasso; эти библиотеки управляют кэшем изображения автоматически и очень настраиваются – crgarridos

+0

Я слышал о picasso, но я не знаю, может ли picasso отображать изображения в автономном режиме – LMaker

+0

Фактически оба они могут это сделать. Вы загружаете свои изображения один раз, и библиотека управляет всеми (внутренне) для вас. Picasso без конфигурации и UIL с первой инициализацией в вашем классе приложения – crgarridos

ответ

1

Для работы с изображениями в Android эталоном является использование Picasso библиотеки. Он берет на себя:

  • Handling рециркуляцию ImageView и скачать гашение в адаптер;
  • Комплексные преобразования изображений с минимальным использованием памяти;
  • Автоматическая память и кэширование диска.

Кроме того, если вы собираетесь отображать изображения в списках и нуждаются в анимации для улучшения пользовательского интерфейса, я настоятельно рекомендую переход от ListView к RecyclerView. Не рекомендуется хранить изображения в БД, вы теряете время, преобразуя это из/в blobs (отметьте here и here). Сказал, что я предлагаю следующее:

  1. Использование Picasso для загрузки изображений из URL-адреса, предоставленного в JSON;
  2. Внедрение пользовательской цели для обработки файла изображения, загруженного Picasso;
  3. Сохраните изображение в папке внутри вашего каталога приложений;
  4. Используйте RecyclerView для отображения изображений; (Опционально)

Если вам нужен пример проекта, где сделали эти вещи, вы можете проверить this. В этом проекте я следую описанному выше подходу. Вы можете загрузить приложение из магазина и посмотреть, как он будет загружать изображения.

Quicky-гид:

  1. Чтобы использовать Picasso добавить это Gradle файл, который вы модуля: compile 'com.squareup.picasso:picasso:2.5.2'

  2. Создать класс, который реализует import com.squareup.picasso.Callback;:

    общественного класса ImageWarehouse реализует обратный вызов { private static final String TAG = "ImageWarehouse";

    private String mDirectory; 
    private String mFileName; 
    private ImageView mContainer; 
    @Inject 
    App mApplication; 
    
    public ImageWarehouse(String fileName, ImageView container, String directory) { 
        this.mFileName = fileName; 
        this.mContainer = container; 
        this.mDirectory = directory; 
        this.getStorageDir(); 
    } 
    
    @Override 
    public void onSuccess() { 
        if (this.isExternalStorageWritable()) { 
         final Bitmap bitmap = ((BitmapDrawable) this.mContainer.getDrawable()).getBitmap(); 
         new AsyncTask<Void, Void, File>() { 
          @Override 
          protected File doInBackground(Void... params) { 
           File file = null; 
           try { 
            file = new File(ImageWarehouse.this.getStorageDir().getPath().concat("/").concat(ImageWarehouse.this.mFileName.concat(Constants.MEDIA_EXTENSION))); 
            file.createNewFile(); 
            FileOutputStream ostream = new FileOutputStream(file); 
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream); 
            ostream.close(); 
           } catch (Exception e) { 
            Log.e(TAG, "External Storage is not available"); 
           } 
           return file; 
          } 
         }.execute(); 
        } else { 
         Log.e(TAG, "External Storage is not available"); 
        } 
    } 
    
    @Override 
    public void onError() { 
    
    } 
    
    public boolean isExternalStorageWritable() { 
        String state = Environment.getExternalStorageState(); 
        if (Environment.MEDIA_MOUNTED.equals(state)) { 
         return true; 
        } 
        return false; 
    } 
    
    public File getStorageDir() { 
        File file = new File(Environment.getExternalStorageDirectory(), Constants.MEDIA_DIRECTORY.concat(this.mDirectory)); 
        if (!file.mkdirs()) { 
        } 
        return file; 
    } 
    

    }

  3. Вызов Пикассо, чтобы отобразить изображение в макете и сохранить его по указанному пути:

    Picasso .load(URL) .fit() .centerCrop() .into(viewHolder.cover, new ImageWarehouse( name, viewHolder.cover, Constants.MEDIA_CHARACTER ) );

+2

Спасибо, вы спасли меня! Спасибо за удивительное объяснение – LMaker

1

Вы можете использовать Android-Universal-Image-Loader, это также изображение кэша в памяти. это показ из кеша, когда в следующий раз тот же URL-адрес, используемый в imageloader для получения изображения

см. ниже ссылку на полный исходный код универсального загрузчика изображений.

Android - Universal Image Loader

0

Вы можете сохранить изображения в Sqlite как blob и может извлекать его, когда требуется. Создать таблицу

create table sometable(id integer primary key autoincrement,photo BLOB); 

И сохранить изображение как

//convert image into byte[] 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.common)).getBitmap(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
byte[] photo = baos.toByteArray(); 

//And now store this image 
ContentValues initialValues = new ContentValues(); 
initialValues.put("photo",photo); 
return db.insert("sometable", null, initialValues); 

и получить изображение

Cursor cur=your query; 
while(cur.moveToNext()) 
{ 
    byte[] photo=cur.getBlob(index of blob cloumn); 
} 
Смежные вопросы