2016-02-18 20 views
3

我使用排球圖像加載器從我的項目從服務器加載圖像。但在某些情況下,我收到以下錯誤和應用程序崩潰。排球圖像加載器ConcurrentModificationException

  java.util.ConcurrentModificationException 
      at java.util.LinkedList$LinkIterator.next(LinkedList.java:124) 
      at com.android.volley.toolbox.ImageLoader$4.run(ImageLoader.java:440) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5343) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

我找不到錯誤原因及解決方法。請幫幫我。

Global.java

​​

LruBitmapCache.java

import com.android.volley.toolbox.ImageLoader.ImageCache; 
import android.graphics.Bitmap; 
import android.support.v4.util.LruCache; 

public class LruBitmapCache extends LruCache<String, Bitmap> implements ImageCache { 
    public static int getDefaultLruCacheSize() { 
     final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024); 
     final int cacheSize = maxMemory/8; 

     return cacheSize; 
    } 

    public LruBitmapCache() { 
     this(getDefaultLruCacheSize()); 
    } 

    public LruBitmapCache(int sizeInKiloBytes) { 
     super(sizeInKiloBytes); 
    } 

    @Override 
    protected int sizeOf(String key, Bitmap value) { 
     return value.getRowBytes() * value.getHeight()/1024; 
    } 

    @Override 
    public Bitmap getBitmap(String url) { 
     return get(url); 
    } 

    @Override 
    public void putBitmap(String url, Bitmap bitmap) { 
     put(url, bitmap); 
    } 
} 

代碼裝載圖像到網絡視圖

ImageLoader myLoader = Global.getInstance().getImageLoader(); 
networkImageView.setImageUrl(thumbnailURL, myLoader); 
myLoader.get(thumbnailURL, new ImageLoader.ImageListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
     //Set Error image 
    } 
    @Override 
    public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 
     if (response.getBitmap() != null) { 
      //Set BitMap 
     } 
     else{ 
      //Set Loading image 
     } 
    } 
}); 

我的服裝網絡視圖圖像視圖聽衆

public class NetworkImageViewListener { 

    private final String TAG_THUMBNAIL_ERROR = "THUMBNAIL_ERROR"; 
    private final String TAG_THUMBNAIL_RECEIVED = "THUMBNAIL_RECEIVED"; 

    private String TAG = getClass().getSimpleName(); 


    private boolean original_image_loaded = false; 
    public void loadImage(final Context context,final String url,final NetworkImageView networkImageView, final int approx_width, final int approx_height,final boolean thumbnail, final ProgressBar progressBar, final boolean is_Store){ 
     networkImageView.setAdjustViewBounds(true); 
     final int picture_not_found = R.drawable.ic_profile_picture_not_found; 
     final int picture_not_loaded = R.drawable.ic_profile_picture_not_loaded; 

     if (url != null && !url.equals("null")&& !url.equals("NULL")&& !url.equals("")) { 
      final String originalURL = getImageUrl(url, approx_width, approx_height); 

      final Bitmap cacheImage = getCacheImage(context, originalURL); 
      if (cacheImage==null) { 

       if(progressBar!=null){ 
        progressBar.setVisibility(View.VISIBLE); 
       } 
       if (thumbnail) { 
        final String thumbnailURL = getImageThumbnailUrl(url, approx_width, approx_height); 

        ImageLoader thumbnailLoader = Global.getInstance().getImageLoader(); 
        networkImageView.setImageUrl(thumbnailURL, thumbnailLoader); 
        thumbnailLoader.get(thumbnailURL, new ImageLoader.ImageListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          if(progressBar==null){ 
           networkImageView.setImageResource(picture_not_found); 
          } 
          networkImageView.setTag(TAG_THUMBNAIL_ERROR); 
          load_Original(context, originalURL, networkImageView, progressBar, is_Store, picture_not_loaded); 
         } 
         @Override 
         public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 
          if (response.getBitmap() != null) { 
           networkImageView.setImageBitmap(response.getBitmap()); 
           networkImageView.setTag(TAG_THUMBNAIL_RECEIVED); 
           load_Original(context, originalURL, networkImageView, progressBar, is_Store, picture_not_loaded); 
          } else if (progressBar==null) { 
           networkImageView.setImageResource(picture_not_found); 
          } 
         } 
        }); 
       } 
       else{ 
        load_Original(context,originalURL,networkImageView,progressBar,is_Store,picture_not_loaded); 
       } 
      } else { 
       networkImageView.setImageBitmap(cacheImage); 
      } 
     } else { 
      networkImageView.setImageResource(picture_not_found); 
     } 
    } 
    private void load_Original(final Context context,final String originalURL,final NetworkImageView networkImageView, final ProgressBar progressBar, final boolean is_Store,final int picture_not_loaded){ 
     final Drawable temp = networkImageView.getDrawable(); 
     final String imageviewTag = (String) networkImageView.getTag(); 
     ImageLoader imageLoader = Global.getInstance().getImageLoader(); 
     networkImageView.setImageUrl(originalURL, imageLoader); 
     imageLoader.get(originalURL, new ImageLoader.ImageListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       if (progressBar != null) { 
        progressBar.setVisibility(View.GONE); 
       } 
       if (temp != null && imageviewTag != null && !imageviewTag.equals(TAG_THUMBNAIL_ERROR)) { 
        networkImageView.setImageDrawable(temp); 
       } else if (temp != null && imageviewTag != null && imageviewTag.equals(TAG_THUMBNAIL_RECEIVED)) { 
        networkImageView.setImageDrawable(temp); 
       } else { 
        networkImageView.setImageResource(picture_not_loaded); 
       } 
      } 

      @Override 
      public void onResponse(ImageLoader.ImageContainer response, boolean shouldAnimate) { 
       if (response.getBitmap() != null) { 
        if (progressBar != null) { 
         progressBar.setVisibility(View.GONE); 
        } 
        networkImageView.setImageBitmap(response.getBitmap()); 
        if (is_Store) { 
         setCacheImage(context, originalURL, response.getBitmap()); 
        } 
       } else { 
        networkImageView.setImageDrawable(temp); 
       } 
      } 
     }); 
    } 

    private static String getImageUrl(String url, int aprox_width, int aprox_height){ 
     int index = url.lastIndexOf('/'); 
     String path = url.substring(0, index); 
     String file_name = url.substring(index + 1); 
     String result = path+"/"+aprox_width+"/"+aprox_height+"/"+file_name; 
     return result; 
    } 

    private static String getImageThumbnailUrl(String url, int approx_width, int aprox_height){ 
     int index = url.lastIndexOf('/'); 
     String path = url.substring(0, index); 
     String file_name = url.substring(index + 1); 
     String result = path+"/"+approx_width+"/"+aprox_height+"/tbnil"+"/"+file_name; 
     return result; 
    } 

    private String profile_picture_folder_name = "PP"; 
    private void setCacheImage(Context context, String url, Bitmap bitmap){ 
     try { 
      if (!getCacheDirectory(context).equals("")) { 
       String filename = getFileName(url); 
       File folder = new File(getCacheDirectory(context)+"/"+profile_picture_folder_name+"/"); 
       if (!folder.exists()) { 
        folder.mkdir(); 
       } 
       if (folder.exists()) { 
        File dest = new File(folder, filename); 
        FileOutputStream out = new FileOutputStream(dest); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 40, out); 
        out.flush(); 
        out.close(); 
       } 
      } 
     } catch (Exception e) { 
      Log.developer(TAG,e.getMessage()); 
     } 
    } 
    private Bitmap getCacheImage(Context context,String url){ 
     try { 
      if (!getCacheDirectory(context).equals("")) { 
       String filename = getFileName(url); 
       File folder = new File(getCacheDirectory(context)+"/"+profile_picture_folder_name+"/"); 
       if (folder.exists()) { 
        FileInputStream fis = null; 
        File imageFile = new File(folder, filename); 
        if (imageFile.exists()) { 
         fis = new FileInputStream(imageFile); 
         return BitmapFactory.decodeStream(fis); 
        } 
       } 
      } 
     } catch (FileNotFoundException e) { 
      Log.developer(TAG, e.getMessage()); 
     } 
     return null; 
    } 
    private String getCacheDirectory(Context context){ 
     String cachePath=""; 
     if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) { 
      if (context.getExternalCacheDir() != null && context.getExternalCacheDir().exists()) { 
       cachePath = context.getExternalCacheDir().getPath(); // most likely your null value 
      } 
      else if (context.getCacheDir() != null && context.getCacheDir().exists()) { 
       cachePath = context.getCacheDir().getPath(); 
      } 
     } else { 
      if (context.getCacheDir() != null && context.getCacheDir().exists()) { 
       cachePath = context.getCacheDir().getPath(); 
      } 
     } 
     return cachePath; 
    } 

    public String getFileName(String urlStr) { 
     return urlStr.substring(urlStr.lastIndexOf('/') + 1, urlStr.length()); 
    } 
} 
+1

發佈完整的stacktrace以及與 – Yazan

+0

相關的代碼@Yazan:我已經按照你的說法添加了。 –

+0

我不認爲從延伸'Application'的類創建實例是個好主意,對吧?這可能是相關的? – Yazan

回答

0

您必須實現兩個ImageLoader,一個用於縮略圖,另一個用於全分辨率圖像。 修改您RequestQueue單如下:

//.. 
private ImageLoader mImageLoader; 
private ImageLoader mThumbLoader; 
//... 
// Then in constructor 
mThumbLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() { ... }); 
mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() { ... }); 

// And then you build two getters 
protected ImageLoader getImageLoader() { 
    return mImageLoader; 
} 

protected ImageLoader getThumbLoader() { 
    return mThumbLoader; 
} 

如果調用了充分水庫圖像mThumbLoader的縮略圖和mImageLoader它會正常工作。