Android毕加索将所有图像预取到磁盘

Android毕加索将所有图像预取到磁盘,android,loading,picasso,prefetch,Android,Loading,Picasso,Prefetch,我想使用毕加索预取图像,并在打开应用程序时将它们全部保存到磁盘(无需动态延迟加载)。为了确保缓存足够大,我在应用程序中使用了以下代码onCreate ContextWrapper cw = new ContextWrapper(getApplicationContext()); // path to /data/data/yourapp/app_data/imageDir File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);

我想使用毕加索预取图像,并在打开应用程序时将它们全部保存到磁盘(无需动态延迟加载)。为了确保缓存足够大,我在应用程序中使用了以下代码
onCreate

ContextWrapper cw = new ContextWrapper(getApplicationContext());
// path to /data/data/yourapp/app_data/imageDir
File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);

OkHttpClient client = new OkHttpClient.Builder()
        .cache(new Cache(directory, Integer.MAX_VALUE))
        .build();
OkHttp3Downloader okHttp3Downloader = new OkHttp3Downloader(client);
Picasso.Builder builder = new Picasso.Builder(this);
builder.downloader(okHttp3Downloader);
Picasso built = builder.build();
built.setIndicatorsEnabled(false);
built.setLoggingEnabled(false);
Picasso.setSingletonInstance(built);
因此,这里我将缓存大小设置为
Integer.MAX\u VALUE
,应该足够大;)

我使用类似于此行的代码预取图像:
Picasso.with(context.load(url.fetch()


现在,当我删除我的互联网和移动数据时,即使我的代码正在获取项目,也不会加载任何图像。你知道为什么吗?

也许问题在于失去状态。您是否尝试扩展应用程序类(如)并将毕加索实例保留在这里


在类似的情况下,当我需要获取大量图像时,我将它们保存到内存中(而不仅仅是缓存中)——以防止重新加载,并将uri保存到文件中到SQLite中,然后使用毕加索处理此类uri。(不要忘记检查用户是否没有删除任何内容)

问题可能是松动状态。您是否尝试扩展应用程序类(如)并将毕加索实例保留在这里


在类似的情况下,当我需要获取大量图像时,我将它们保存到内存中(而不仅仅是缓存中)——以防止重新加载,并将uri保存到文件中到SQLite中,然后使用毕加索处理此类uri。(不要忘记检查用户是否没有删除任何内容)

最后,我创建了自己的图像管理器,用于下载和存储图像(仍在使用毕加索下载图像)。

最后,我创建了自己的图像管理器,用于下载和存储图像(仍在使用毕加索下载图像)。

以下是我的方法:

在应用程序的onCreate方法中,执行以下操作:

Picasso picasso = new Picasso.Builder(this)
        .downloader(new OkHttp3Downloader(this,Integer.MAX_VALUE))
        .build();
picasso.setIndicatorsEnabled(BuildConfig.DEBUG);
picasso.setLoggingEnabled(BuildConfig.DEBUG);
Picasso.setSingletonInstance(picasso);
然后,无论您想在何处加载图像,都可以为每个图像的url调用此选项:

Picasso.with(context).load(url).fetch();
从文件:

fetch()

异步完成请求,无需ImageView或目标。当您要使用图像预热缓存时,这非常有用

您甚至可以检查可能的错误

以下是我的方法:

在应用程序的onCreate方法中,执行以下操作:

Picasso picasso = new Picasso.Builder(this)
        .downloader(new OkHttp3Downloader(this,Integer.MAX_VALUE))
        .build();
picasso.setIndicatorsEnabled(BuildConfig.DEBUG);
picasso.setLoggingEnabled(BuildConfig.DEBUG);
Picasso.setSingletonInstance(picasso);
然后,无论您想在何处加载图像,都可以为每个图像的url调用此选项:

Picasso.with(context).load(url).fetch();
从文件:

fetch()

异步完成请求,无需ImageView或目标。当您要使用图像预热缓存时,这非常有用


你甚至可以检查可能的错误

一般来说,用正手下载所有图像似乎是一个非常糟糕的主意。我无法想象你在人们宝贵的磁盘空间上分配了多少空间。@tim我完全同意。这不是我的描述,但懒散加载不是一个选项。一般来说,这似乎是一个非常坏的主意下载所有的图片正手。我无法想象你在人们宝贵的磁盘空间上分配了多少空间。@tim我完全同意。这不是我的说明,但是延迟加载不是一个选项。我可以询问有关映像管理器的更多信息吗?你用的是什么下载程序?您下载和存储图像的过程是什么?您是否正在运行
IntentService
来执行此任务?我正在尝试使用JobScheduler执行类似的操作,但在作业完成和作业取消之前,活动已被销毁。我可以询问有关映像管理器的更多信息吗?你用的是什么下载程序?您下载和存储图像的过程是什么?您是否正在运行
IntentService
来执行此任务?我正在尝试使用JobScheduler执行类似的操作,但在作业完成和作业取消之前,活动已被销毁。