2017-01-11 5 views
3

私は画像URLでRealmデータベースを持っており、これらの画像をExternalCacheDirにダウンロードする必要があります。ここに問題があります。私は3つの画像があると仮定します:ar11.jpgar12.jpgar13.jpg。私のコードが実行されると、上記の名前でキャッシュディレクトリに3つのjpgイメージが得られますが、最後のイメージの複製はすべてar11ar12ar13ar13.jpgです。ここで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.jpgar11.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; 
} 
+0

@superman: 次に同じことが、このコードを試してみてくださいar12.jpgar13.jpg

とどうなりますか?はいの場合は、それを受け入れてください。 – Sangharsh

関連する問題