Java 使用毕加索下载图像会在缓存中创建不正确的图像,可能的修复方法?

Java 使用毕加索下载图像会在缓存中创建不正确的图像,可能的修复方法?,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

我有一个带有image
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());
}
@凌驾