滑动后台线程在磁盘上的缓存图像

时间:2018-09-23 09:09:15

标签: android multithreading android-glide

我想使用Glide急切下载图像并将其缓存在磁盘上以备将来使用。我想从后台线程调用此功能。

我已经读过Glide's caching documentation,但是它没有解释如何在没有实际目标的情况下下载图像。然后,我发现this issue并尝试使用类似的方法,但是无论我如何尝试,都会遇到此异常:

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

那么,如何告诉Glide从后台线程缓存图像?

编辑:我真的很想在后台线程上调用Glide的方法。我知道我可以使用Handler和其他方式将其卸载到UI线程,但这不是我要的。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

如果要在缓存中加载图像以供将来在后台线程中使用,则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();

答案 2 :(得分:0)

我问对了吗?

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
    }
}

答案 3 :(得分:0)

  

您必须在主线程上调用此方法

无论您调用哪种方法使用Glide或在后台执行某项操作,请在内部运行:

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

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

            }
        });

要在主线程中使用它,然后应消除错误。

答案 4 :(得分:0)

into(ImageView)的{​​{1}}方法只要求您在主线程上调用它,但是当您将加载传递给Timer时,它将在Glide线程中执行。

您可以做的是通过调用background而不是get()来检索位图,然后通过调用into()bitmap上设置ImageView

setImageBitmap()

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

尝试一下。