Android Picasso 正在将所有图像预取到磁盘
Android Picasso prefetching all images to disk
我想使用 Picasso 预取图像并在打开应用程序时将它们全部保存到磁盘(没有即时延迟加载)。为了确保缓存足够大,我在我的应用程序中使用了以下代码 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_VALUE
这应该足够大了 ;)
我使用类似于此行的代码来预取图像:Picasso.with(context).load(url).fetch();
。
现在,当我终止我的互联网和移动数据时,即使我的代码正在获取项目,也不会加载任何图像。有什么想法吗?
可能是状态丢失的问题。您是否尝试扩展 Application class(如 this)并在此处保留 Picasso 实例?
在类似的情况下,当我需要获取大量图像时,我将它们保存到内部存储器中(不仅仅是在某些缓存中)- 以防止重新加载,并将 uri 保存到文件到 SQLite 中,然后使用 Picasso 进行处理这样的 URI。 (不要忘记检查用户没有删除任何东西)。
最后我创建了自己的图像管理器来下载和存储图像(仍然使用 picasso 来下载它们)。
这是我的方法:
在应用程序的 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()
Asynchronously fulfills the request without a ImageView or Target. This is useful when you want to warm up the cache with an image.
您甚至可以pass in callback检查可能的错误
我想使用 Picasso 预取图像并在打开应用程序时将它们全部保存到磁盘(没有即时延迟加载)。为了确保缓存足够大,我在我的应用程序中使用了以下代码 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_VALUE
这应该足够大了 ;)
我使用类似于此行的代码来预取图像:Picasso.with(context).load(url).fetch();
。
现在,当我终止我的互联网和移动数据时,即使我的代码正在获取项目,也不会加载任何图像。有什么想法吗?
可能是状态丢失的问题。您是否尝试扩展 Application class(如 this)并在此处保留 Picasso 实例?
在类似的情况下,当我需要获取大量图像时,我将它们保存到内部存储器中(不仅仅是在某些缓存中)- 以防止重新加载,并将 uri 保存到文件到 SQLite 中,然后使用 Picasso 进行处理这样的 URI。 (不要忘记检查用户没有删除任何东西)。
最后我创建了自己的图像管理器来下载和存储图像(仍然使用 picasso 来下载它们)。
这是我的方法:
在应用程序的 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()
Asynchronously fulfills the request without a ImageView or Target. This is useful when you want to warm up the cache with an image.
您甚至可以pass in callback检查可能的错误