Скользить кеш-образ на диске в фоновом потоке - PullRequest
0 голосов
/ 23 сентября 2018

Я хочу использовать Glide для быстрой загрузки изображений и кэширования их на диске для дальнейшего использования.Я хочу вызвать эту функцию из фонового потока.

Я прочитал Документация по кешированию Glide , но она не объясняет, как загрузить изображение без фактической цели прямо сейчас.Затем я обнаружил эту проблему и попытался использовать аналогичный подход, но что бы я ни пытался, я получаю следующее исключение:

java.lang.IllegalArgumentException: You must call this method on the main thread

Итак, как я могу сказать Glide кэшировать изображение изфоновый поток?

РЕДАКТИРОВАТЬ: Я действительно хочу вызвать методы Glide в фоновом потоке.Я знаю, что могу использовать Handler и другие способы для его разгрузки в поток пользовательского интерфейса, но я не об этом спрашиваю.

Ответы [ 5 ]

0 голосов
/ 23 сентября 2018

Если вы хотите загрузить изображения в кэш для дальнейшего использования в фоновом потоке , тогда у Glide есть эта функция

здесь, как вы можете сделать это

 //here i passing application context so our glide tie itself with application lifecycle

FutureTarget<File> future = Glide.with(getApplicationContext()).downloadOnly().load("your_image_url").submit();

сейчас, есливы хотите получить сохраненный путь, который хотите сохранить в своей БД, затем вы можете сделать

File file = future.get();
String path = file.getAbsolutePath();

, вы также можете сделать это всего за одну строку, возвращая строку пути, подобную этой

String path = Glide.with(getApplicationContext()).downloadOnly().load("your_image_url").submit().get().getAbsolutePath();
0 голосов
/ 23 сентября 2018
GlideApp.with(context)
    .downloadOnly()
    .diskCacheStrategy(DiskCacheStrategy.DATA) // Cache resource before it's decoded
    .load(url)
    .submit(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
    .get() // Called on background thread
0 голосов
/ 23 сентября 2018

Вы должны вызвать этот метод в главном потоке

Везде, где вы вызываете метод для использования Glide или делаете что-то из фона, запустите внутри:

runOnUiThread(new Runnable() {
                @Override
                public void run() {

              // Here, use glide or do your things on UiThread

            }
        });

Чтобы использовать его внутри основного потока, а затем ошибка должна исчезнуть.

0 голосов
/ 23 сентября 2018

Метод into(ImageView) Glide требует, чтобы вы вызывали его только в главном потоке, но когда вы передадите загрузку в Timer, он будет выполнен в потоке background.

Что выможно получить растровое изображение, вызвав get() вместо into(), а затем установить bitmap на ImageView, вызвав setImageBitmap().

Glide.with(getApplicationContext())
     .load("your url")
     .asBitmap()
     .get()

или

Glide.with(getApplicationContext())
     .load("your url")
     .asBitmap()
     .into(new BitmapImageViewTarget(imgView) {
      @Override
      protected void setResource(Bitmap resource) {
       //Play with bitmap
        super.setResource(resource);
      }
    });

Попробуйте это.

0 голосов
/ 23 сентября 2018

Правильно ли я понял вопрос?

private class update extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
        RequestOptions options = new RequestOptions()
        .diskCacheStrategy(DiskCacheStrategy.ALL) // Saves all image resolution
        .centerCrop()
        .priority(Priority.HIGH)
        .placeholder(R.drawable.null_image_profile)
        .error(R.drawable.null_image_profile);

    Glide.with(context).load(imageUrl)
        .apply(options);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        //finish
    }
}
...