2017-01-11 23 views
3

我有一個Realm數據庫與圖像URL s,我需要下載這些圖像在ExternalCacheDir。現在這裏是問題:假設我有三個圖像:ar11.jpg,ar12.jpg,ar13.jpg。一旦我的代碼被執行,我在高速緩存目錄中獲得3 jpg圖像,並帶有上述名稱,但是所有三個圖像都是最後一個圖像的副本,即ar13.jpg,其名稱爲ar11,ar12,ar13使用Picasso下載圖像會在緩存中創建不正確的圖像,可能會修復?

這裏是我的代碼:

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) { 

    } 
}; 

了可能是造成這種冗餘,以及如何解決它?

回答

1

爲每個圖像調用目標。

每個圖像都在緩存下寫入每個名稱下。

第一個ar11.jpg保存爲ar11.jpg, ar12.jpg, ar13.jpg。 然後用相同和ar12.jpgar13.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; 
} 
+0

@superman,這是否對你的工作?如果是,請接受它。 – Sangharsh

相關問題