Java 使用毕加索下载图像会在缓存中创建不正确的图像,可能的修复方法?
我有一个带有imageJava 使用毕加索下载图像会在缓存中创建不正确的图像,可能的修复方法?,java,android,image,picasso,Java,Android,Image,Picasso,我有一个带有imageURLs的领域数据库,我需要在ExternalCacheDir中下载这些图像。现在问题就出在这里了:假设我有三张图片:ar11.jpg,ar12.jpg,ar13.jpg。执行代码后,我在缓存目录中获得3个jpg图像,具有上述名称,但所有三个图像都是最后一个图像的副本,即ar13.jpg,名称为ar11,ar12,ar13 这是我的密码: private void downloadImage() { RealmResults<ARDatabase> r
URL
s的领域数据库,我需要在ExternalCacheDir
中下载这些图像。现在问题就出在这里了:假设我有三张图片:ar11.jpg
,ar12.jpg
,ar13.jpg
。执行代码后,我在缓存目录中获得3个jpg图像,具有上述名称,但所有三个图像都是最后一个图像的副本,即ar13.jpg
,名称为ar11
,ar12
,ar13
这是我的密码:
private void downloadImage()
{
RealmResults<ARDatabase> results = mRealm.where(ARDatabase.class).findAll();
for(ARDatabase x:results)
{
if(!x.getIsDownloaded())
{
mdataCollection.add(new DownLoadList(x.getUrlImg(),x.getUid()));
}
}
for(DownLoadList i:mdataCollection)
{
Log.e("Link",""+i.getImageUrl());
Picasso.with(getApplicationContext()).load(i.getImageUrl()).into(target);
}
}
private Target target = new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from)
{
Log.e("PICASSO","SUCCESSFUL");
new Thread(new Runnable() {
@Override
public void run() {
File sd = getExternalCacheDir();
File folder = new File(sd, "/arproject/");
if (!folder.exists()) {
if (!folder.mkdir()) {
Log.e("ERROR", "Cannot create a directory!");
} else {
folder.mkdirs();
}
}
//File[] fileName = {new File(folder, "one.jpg"), new File(folder, "two.jpg")};
for (DownLoadList i:mdataCollection)
{
File fileName = new File(folder,i.getUid().toLowerCase()+".jpg");
if (!fileName.exists()) {
try {
fileName.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
else
{
try {
FileOutputStream outputStream = new FileOutputStream(String.valueOf(fileName));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
@Override
public void onBitmapFailed(Drawable errorDrawable)
{
Log.e("PICASSO","FAILED"+errorDrawable.toString());
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
private void downloadImage()
{
RealmResults results=mRealm.where(ARDatabase.class).findAll();
对于(ARDatabase x:结果)
{
如果(!x.getIsDownloaded())
{
添加(新的下载列表(x.getUrlImg(),x.getUid());
}
}
对于(下载列表i:mdataCollection)
{
Log.e(“Link”,“i.getImageUrl());
Picasso.with(getApplicationContext()).load(i.getImageUrl()).into(target);
}
}
私有目标=新目标(){
@凌驾
公共无效onBitmapLoaded(最终位图,Picasso.LoadedFrom)
{
Log.e(“毕加索”,“成功”);
新线程(newrunnable()){
@凌驾
公开募捐{
文件sd=getExternalCacheDir();
文件夹=新文件(sd,“/arproject/”);
如果(!folder.exists()){
如果(!folder.mkdir()){
Log.e(“错误”,“无法创建目录!”);
}否则{
folder.mkdirs();
}
}
//File[]fileName={新文件(文件夹“one.jpg”)、新文件(文件夹“two.jpg”)};
对于(下载列表i:mdataCollection)
{
文件名=新文件(文件夹,i.getUid().toLowerCase()+“.jpg”);
如果(!fileName.exists()){
试一试{
fileName.createNewFile();
}捕获(IOE异常){
e、 printStackTrace();
}
}
其他的
{
试一试{
FileOutputStream outputStream=新的FileOutputStream(String.valueOf(fileName));
compress(bitmap.CompressFormat.JPEG,100,outputStream);
outputStream.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
}).start();
}
@凌驾
公共无效onBitmapFailed(Drawable errorDrawable)
{
Log.e(“毕加索”,“失败”+errorDrawable.toString());
}
@凌驾
准备加载时的公共无效(可提取占位符可提取){
}
};
什么可能导致这种冗余,以及如何修复它?为每个图像调用目标 每个图像都以每个名称写入缓存 第一个
ar11.jpg
保存为ar11.jpg、ar12.jpg、ar13.jpg
。
然后,ar12.jpg
和ar13.jpg
请尝试以下代码:
private void downloadImage()
{
RealmResults<ARDatabase> results = mRealm.where(ARDatabase.class).findAll();
for(ARDatabase x:results)
{
if(!x.getIsDownloaded())
{
mdataCollection.add(new DownLoadList(x.getUrlImg(),x.getUid()));
}
}
for(DownLoadList i:mdataCollection)
{
Log.e("Link",""+i.getImageUrl());
Picasso.with(getApplicationContext()).load(i.getImageUrl()).into(getTarget(i));
}
}
private Target getTarget(DownLoadList downLoadList) {
Target target = new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from)
{
Log.e("PICASSO","SUCCESSFUL");
new Thread(new Runnable() {
@Override
public void run() {
File sd = getExternalCacheDir();
File folder = new File(sd, "/arproject/");
if (!folder.exists()) {
if (!folder.mkdir()) {
Log.e("ERROR", "Cannot create a directory!");
} else {
folder.mkdirs();
}
}
//File[] fileName = {new File(folder, "one.jpg"), new File(folder, "two.jpg")};
File fileName = new File(folder, downLoadList.getUid().toLowerCase()+".jpg");
if (!fileName.exists()) {
try {
fileName.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
else
{
try {
FileOutputStream outputStream = new FileOutputStream(String.valueOf(fileName));
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
@Override
public void onBitmapFailed(Drawable errorDrawable)
{
Log.e("PICASSO","FAILED"+errorDrawable.toString());
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
}
return target;
}
private void downloadImage()
{
RealmResults results=mRealm.where(ARDatabase.class).findAll();
对于(ARDatabase x:结果)
{
如果(!x.getIsDownloaded())
{
添加(新的下载列表(x.getUrlImg(),x.getUid());
}
}
对于(下载列表i:mdataCollection)
{
Log.e(“Link”,“i.getImageUrl());
Picasso.with(getApplicationContext()).load(i.getImageUrl()).into(getTarget(i));
}
}
私有目标getTarget(下载列表下载列表){
目标=新目标(){
@凌驾
公共无效onBitmapLoaded(最终位图,Picasso.LoadedFrom)
{
Log.e(“毕加索”,“成功”);
新线程(newrunnable()){
@凌驾
公开募捐{
文件sd=getExternalCacheDir();
文件夹=新文件(sd,“/arproject/”);
如果(!folder.exists()){
如果(!folder.mkdir()){
Log.e(“错误”,“无法创建目录!”);
}否则{
folder.mkdirs();
}
}
//File[]fileName={新文件(文件夹“one.jpg”)、新文件(文件夹“two.jpg”)};
文件名=新文件(文件夹,downLoadList.getUid().toLowerCase()+“.jpg”);
如果(!fileName.exists()){
试一试{
fileName.createNewFile();
}捕获(IOE异常){
e、 printStackTrace();
}
}
其他的
{
试一试{
FileOutputStream outputStream=新的FileOutputStream(String.valueOf(fileName));
compress(bitmap.CompressFormat.JPEG,100,outputStream);
outputStream.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
}).start();
}
@凌驾
公共无效onBitmapFailed(Drawable errorDrawable)
{
Log.e(“毕加索”,“失败”+errorDrawable.toString());
}
@凌驾