2012-12-27 24 views
1

嗨,我寫了下面的代碼下載圖像到我的應用程序。圖像下載類有錯誤與枚舉聲明

public class ImageDownloader 
{ 
    private static final int DELAY_BEFORE_PURGE = 10000; 
    private static final int HARD_CACHE_CAPACITY = 10; 
    private static final String LOG_TAG = "ImageDownloader"; 
    @SuppressWarnings("unchecked") 
private static final ConcurrentHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache = new ConcurrentHashMap<String, SoftReference<Bitmap>>(5); 
    private Mode1 mode = Mode1.CORRECT; 
    private final Handler purgeHandler = new Handler(); 
    private final Runnable purger = new Runnable() 
    { 
    public void run() 
    { 
     ImageDownloader.this.clearCache(); 
    } 
    }; 
    private final HashMap<String, Bitmap> sHardBitmapCache = new LinkedHashMap(5, 0.75F, true) 
    { 
    protected boolean removeEldestEntry(Map.Entry<String, Bitmap> paramAnonymousEntry) 
    { 
     if (size() > 10) 
     ImageDownloader.sSoftBitmapCache.put((String)paramAnonymousEntry.getKey(), new SoftReference((Bitmap)paramAnonymousEntry.getValue())); 
     for (boolean bool = true; ; bool = false) 
     return bool; 
    } 
    }; 


private Bitmap localObject2; private void addBitmapToCache(String paramString, Bitmap paramBitmap) 
    { 
    if (paramBitmap != null) 
     synchronized (this.sHardBitmapCache) 
     { 
     this.sHardBitmapCache.put(paramString, paramBitmap); 
     } 
    } 

    private static boolean cancelPotentialDownload(String paramString, ImageView paramImageView) 
    { 
    boolean bool = true; 
    BitmapDownloaderTask localBitmapDownloaderTask = getBitmapDownloaderTask(paramImageView); 
    if (localBitmapDownloaderTask != null) 
    { 
     String str = localBitmapDownloaderTask.url; 
     if ((str != null) && (str.equals(paramString))) 
     break label39; 
     localBitmapDownloaderTask.cancel(bool); 
    } 
    while (true) 
    { 
     return bool; 
     label39: bool = false; 
    } 
    } 

    private void forceDownload(String paramString, ImageView paramImageView) 
    { 
    if (paramString == null) 
     paramImageView.setImageDrawable(null); 
    while (true) 
    { 
     return; 
     if (cancelPotentialDownload(paramString, paramImageView)) 
     switch ($SWITCH_TABLE$org$fluturasymphony$recommendation$ImageDownloader$Mode()[this.mode.ordinal()]) 
     { 
     default: 
      break; 
     case 1: 
      Bitmap localBitmap = downloadBitmap(paramString); 
      addBitmapToCache(paramString, localBitmap); 
      paramImageView.setImageBitmap(localBitmap); 
      break; 
     case 2: 
      paramImageView.setMinimumHeight(156); 
      new BitmapDownloaderTask(paramImageView).execute(new String[] { paramString }); 
      break; 
     case 3: 
      BitmapDownloaderTask localBitmapDownloaderTask = new BitmapDownloaderTask(paramImageView); 
      paramImageView.setImageDrawable(new DownloadedDrawable(localBitmapDownloaderTask)); 
      paramImageView.setMinimumHeight(156); 
      localBitmapDownloaderTask.execute(new String[] { paramString }); 
     } 
    } 
    } 

    private int[] $SWITCH_TABLE$org$fluturasymphony$recommendation$ImageDownloader$Mode() { 
    // TODO Auto-generated method stub 
    return null; 
} 

private static BitmapDownloaderTask getBitmapDownloaderTask(ImageView paramImageView) 
    { 
    Drawable localDrawable; 
    if (paramImageView != null) 
    { 
     localDrawable = paramImageView.getDrawable(); 
     if (!(localDrawable instanceof DownloadedDrawable)); 
    } 
    for (BitmapDownloaderTask localBitmapDownloaderTask = ((DownloadedDrawable)localDrawable).getBitmapDownloaderTask(); ; localBitmapDownloaderTask = null) 
     return localBitmapDownloaderTask; 
    } 

    private Bitmap getBitmapFromCache(String paramString) 
    { 
    synchronized (this.sHardBitmapCache) 
    { 
     Bitmap localBitmap1 = (Bitmap)this.sHardBitmapCache.get(paramString); 
     if (localBitmap1 != null) 
     { 
     this.sHardBitmapCache.remove(paramString); 
     this.sHardBitmapCache.put(paramString, localBitmap1); 
     localObject2 = localBitmap1; 
     } 
     else 
     { 
     SoftReference localSoftReference = (SoftReference)sSoftBitmapCache.get(paramString); 
     if (localSoftReference != null) 
     { 
      Bitmap localBitmap2 = (Bitmap)localSoftReference.get(); 
      if (localBitmap2 != null) 
      localObject2 = localBitmap2; 
     } 
     } 
    } 
    sSoftBitmapCache.remove(paramString); 
    Object localObject2 = null; 
    return (Bitmap) localObject2; 
    } 

    private void resetPurgeTimer() 
    { 
    this.purgeHandler.removeCallbacks(this.purger); 
    this.purgeHandler.postDelayed(this.purger, 10000L); 
    } 

    public void clearCache() 
    { 
    this.sHardBitmapCache.clear(); 
    sSoftBitmapCache.clear(); 
    } 

    public void download(String paramString, ImageView paramImageView) 
    { 
    resetPurgeTimer(); 
    Bitmap localBitmap = getBitmapFromCache(paramString); 
    if (localBitmap == null) 
     forceDownload(paramString, paramImageView); 
    while (true) 
    { 
     return; 
     cancelPotentialDownload(paramString, paramImageView); 
     paramImageView.setImageBitmap(localBitmap); 
    } 
    } 

    // ERROR // 
    Bitmap downloadBitmap(String paramString) 
    { 
    // Byte code: 
    // 0: aload_0 
    // 1: getfield 65 org/fluturasymphony/recommendation/ImageDownloader:mode Lorg/fluturasymphony/recommendation/ImageDownloader$Mode; 
    // 4: getstatic 48 org/fluturasymphony/recommendation/ImageDownloader$Mode:NO_ASYNC_TASK Lorg/fluturasymphony/recommendation/ImageDownloader$Mode; 
    // 7: if_acmpne +107 -> 114 
    // 10: new 213 org/apache/http/impl/client/DefaultHttpClient 
    // 13: dup 
    // 14: invokespecial 214 org/apache/http/impl/client/DefaultHttpClient:<init> ()V 
    // 17: astore_2 
    // 18: new 216 org/apache/http/client/methods/HttpGet 
    // 21: dup 
    // 22: aload_1 
    // 23: invokespecial 219 org/apache/http/client/methods/HttpGet:<init> (Ljava/lang/String;)V 
    // 26: astore_3 
    // 27: aload_2 
    // 28: aload_3 
    // 29: invokeinterface 224 2 0 
    // 34: astore 15 
    // 36: aload 15 
    // 38: invokeinterface 230 1 0 
    // 43: invokeinterface 235 1 0 
    // 48: istore 16 
    // 50: iload 16 
    // 52: sipush 200 
    // 55: if_icmpeq +69 -> 124 
    // 58: ldc 15 
    // 60: new 237 java/lang/StringBuilder 
    // 63: dup 
    // 64: ldc 239 
    // 66: invokespecial 240 java/lang/StringBuilder:<init> (Ljava/lang/String;)V 
    // 69: iload 16 
    // 71: invokevirtual 244 java/lang/StringBuilder:append (I)Ljava/lang/StringBuilder; 
    // 74: ldc 246 
    // 76: invokevirtual 249 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
    // 79: aload_1 
    // 80: invokevirtual 249 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
    // 83: invokevirtual 253 java/lang/StringBuilder:toString ()Ljava/lang/String; 
    // 86: invokestatic 259 android/util/Log:w (Ljava/lang/String;Ljava/lang/String;)I 
    // 89: pop 
    // 90: aload_2 
    // 91: instanceof 261 
    // 94: istore 23 
    // 96: aconst_null 
    // 97: astore 8 
    // 99: iload 23 
    // 101: ifeq +10 -> 111 
    // 104: aload_2 
    // 105: checkcast 261 android/net/http/AndroidHttpClient 
    // 108: invokevirtual 264 android/net/http/AndroidHttpClient:close ()V 
    // 111: aload 8 
    // 113: areturn 
    // 114: ldc_w 266 
    // 117: invokestatic 270 android/net/http/AndroidHttpClient:newInstance (Ljava/lang/String;)Landroid/net/http/AndroidHttpClient; 
    // 120: astore_2 
    // 121: goto -103 -> 18 
    // 124: aload 15 
    // 126: invokeinterface 274 1 0 
    // 131: astore 17 
    // 133: aload 17 
    // 135: ifnull +280 -> 415 
    // 138: aconst_null 
    // 139: astore 19 
    // 141: aload 17 
    // 143: invokeinterface 280 1 0 
    // 148: astore 19 
    // 150: new 282 org/fluturasymphony/recommendation/ImageDownloader$FlushedInputStream 
    // 153: dup 
    // 154: aload 19 
    // 156: invokespecial 285 org/fluturasymphony/recommendation/ImageDownloader$FlushedInputStream:<init> (Ljava/io/InputStream;)V 
    // 159: invokestatic 291 android/graphics/BitmapFactory:decodeStream (Ljava/io/InputStream;)Landroid/graphics/Bitmap; 
    // 162: astore 21 
    // 164: aload 19 
    // 166: ifnull +8 -> 174 
    // 169: aload 19 
    // 171: invokevirtual 294 java/io/InputStream:close ()V 
    // 174: aload 17 
    // 176: invokeinterface 297 1 0 
    // 181: aload_2 
    // 182: instanceof 261 
    // 185: ifeq +10 -> 195 
    // 188: aload_2 
    // 189: checkcast 261 android/net/http/AndroidHttpClient 
    // 192: invokevirtual 264 android/net/http/AndroidHttpClient:close ()V 
    // 195: aload 21 
    // 197: astore 8 
    // 199: goto -88 -> 111 
    // 202: astore 20 
    // 204: aload 19 
    // 206: ifnull +8 -> 214 
    // 209: aload 19 
    // 211: invokevirtual 294 java/io/InputStream:close ()V 
    // 214: aload 17 
    // 216: invokeinterface 297 1 0 
    // 221: aload 20 
    // 223: athrow 
    // 224: astore 12 
    // 226: aload_3 
    // 227: invokevirtual 300 org/apache/http/client/methods/HttpGet:abort ()V 
    // 230: ldc 15 
    // 232: new 237 java/lang/StringBuilder 
    // 235: dup 
    // 236: ldc_w 302 
    // 239: invokespecial 240 java/lang/StringBuilder:<init> (Ljava/lang/String;)V 
    // 242: aload_1 
    // 243: invokevirtual 249 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
    // 246: invokevirtual 253 java/lang/StringBuilder:toString ()Ljava/lang/String; 
    // 249: aload 12 
    // 251: invokestatic 305 android/util/Log:w (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I 
    // 254: pop 
    // 255: aload_2 
    // 256: instanceof 261 
    // 259: istore 14 
    // 261: aconst_null 
    // 262: astore 8 
    // 264: iload 14 
    // 266: ifeq -155 -> 111 
    // 269: aload_2 
    // 270: checkcast 261 android/net/http/AndroidHttpClient 
    // 273: invokevirtual 264 android/net/http/AndroidHttpClient:close ()V 
    // 276: aconst_null 
    // 277: astore 8 
    // 279: goto -168 -> 111 
    // 282: astore 9 
    // 284: aload_3 
    // 285: invokevirtual 300 org/apache/http/client/methods/HttpGet:abort ()V 
    // 288: ldc 15 
    // 290: new 237 java/lang/StringBuilder 
    // 293: dup 
    // 294: ldc_w 307 
    // 297: invokespecial 240 java/lang/StringBuilder:<init> (Ljava/lang/String;)V 
    // 300: aload_1 
    // 301: invokevirtual 249 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
    // 304: invokevirtual 253 java/lang/StringBuilder:toString ()Ljava/lang/String; 
    // 307: invokestatic 259 android/util/Log:w (Ljava/lang/String;Ljava/lang/String;)I 
    // 310: pop 
    // 311: aload_2 
    // 312: instanceof 261 
    // 315: istore 11 
    // 317: aconst_null 
    // 318: astore 8 
    // 320: iload 11 
    // 322: ifeq -211 -> 111 
    // 325: aload_2 
    // 326: checkcast 261 android/net/http/AndroidHttpClient 
    // 329: invokevirtual 264 android/net/http/AndroidHttpClient:close ()V 
    // 332: aconst_null 
    // 333: astore 8 
    // 335: goto -224 -> 111 
    // 338: astore 5 
    // 340: aload_3 
    // 341: invokevirtual 300 org/apache/http/client/methods/HttpGet:abort ()V 
    // 344: ldc 15 
    // 346: new 237 java/lang/StringBuilder 
    // 349: dup 
    // 350: ldc_w 309 
    // 353: invokespecial 240 java/lang/StringBuilder:<init> (Ljava/lang/String;)V 
    // 356: aload_1 
    // 357: invokevirtual 249 java/lang/StringBuilder:append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
    // 360: invokevirtual 253 java/lang/StringBuilder:toString ()Ljava/lang/String; 
    // 363: aload 5 
    // 365: invokestatic 305 android/util/Log:w (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I 
    // 368: pop 
    // 369: aload_2 
    // 370: instanceof 261 
    // 373: istore 7 
    // 375: aconst_null 
    // 376: astore 8 
    // 378: iload 7 
    // 380: ifeq -269 -> 111 
    // 383: aload_2 
    // 384: checkcast 261 android/net/http/AndroidHttpClient 
    // 387: invokevirtual 264 android/net/http/AndroidHttpClient:close ()V 
    // 390: aconst_null 
    // 391: astore 8 
    // 393: goto -282 -> 111 
    // 396: astore 4 
    // 398: aload_2 
    // 399: instanceof 261 
    // 402: ifeq +10 -> 412 
    // 405: aload_2 
    // 406: checkcast 261 android/net/http/AndroidHttpClient 
    // 409: invokevirtual 264 android/net/http/AndroidHttpClient:close ()V 
    // 412: aload 4 
    // 414: athrow 
    // 415: aload_2 
    // 416: instanceof 261 
    // 419: istore 18 
    // 421: aconst_null 
    // 422: astore 8 
    // 424: iload 18 
    // 426: ifeq -315 -> 111 
    // 429: aload_2 
    // 430: checkcast 261 android/net/http/AndroidHttpClient 
    // 433: invokevirtual 264 android/net/http/AndroidHttpClient:close ()V 
    // 436: aconst_null 
    // 437: astore 8 
    // 439: goto -328 -> 111 
    // 
    // Exception table: 
    // from to target type 
    // 141 164 202 finally 
    // 27 90 224 java/io/IOException 
    // 124 133 224 java/io/IOException 
    // 169 181 224 java/io/IOException 
    // 209 224 224 java/io/IOException 
    // 27 90 282 java/lang/IllegalStateException 
    // 124 133 282 java/lang/IllegalStateException 
    // 169 181 282 java/lang/IllegalStateException 
    // 209 224 282 java/lang/IllegalStateException 
    // 27 90 338 java/lang/Exception 
    // 124 133 338 java/lang/Exception 
    // 169 181 338 java/lang/Exception 
    // 209 224 338 java/lang/Exception 
    // 27 90 396 finally 
    // 124 133 396 finally 
    // 169 181 396 finally 
    // 209 224 396 finally 
    // 226 255 396 finally 
    // 284 311 396 finally 
    // 340 369 396 finally 
    } 

    public void setMode(Mode1 paramMode) 
    { 
    this.mode = paramMode; 
    clearCache(); 
    } 

    class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> 
    { 
    private final WeakReference<ImageView> imageViewReference; 
    private String url; 

    public BitmapDownloaderTask(ImageView arg2) 
    { 
     Object localObject; 
     this.imageViewReference = new WeakReference(localObject); 
    } 

    protected Bitmap doInBackground(String[] paramArrayOfString) 
    { 
     this.url = paramArrayOfString[0]; 
     return ImageDownloader.this.downloadBitmap(this.url); 
    } 

    protected void onPostExecute(Bitmap paramBitmap) 
    { 
     if (isCancelled()) 
     paramBitmap = null; 
     ImageDownloader.this.addBitmapToCache(this.url, paramBitmap); 
     if (this.imageViewReference != null) 
     { 
     ImageView localImageView = (ImageView)this.imageViewReference.get(); 
     if ((this == ImageDownloader.getBitmapDownloaderTask(localImageView)) || (ImageDownloader.this.mode != ImageDownloader.Mode1.CORRECT)) 
      localImageView.setImageBitmap(paramBitmap); 
     } 
    } 
    } 

    static class DownloadedDrawable extends ColorDrawable 
    { 
    private final WeakReference<ImageDownloader.BitmapDownloaderTask> bitmapDownloaderTaskReference; 

    public DownloadedDrawable(ImageDownloader.BitmapDownloaderTask paramBitmapDownloaderTask) 
    { 
     super(); 
     this.bitmapDownloaderTaskReference = new WeakReference<BitmapDownloaderTask>(paramBitmapDownloaderTask); 
    } 

    public ImageDownloader.BitmapDownloaderTask getBitmapDownloaderTask() 
    { 
     return (ImageDownloader.BitmapDownloaderTask)this.bitmapDownloaderTaskReference.get(); 
    } 
    } 

    static class FlushedInputStream extends FilterInputStream 
    { 
    public FlushedInputStream(InputStream paramInputStream) 
    { 
     super(paramInputStream); 
    } 

    public long skip(long paramLong) 
     throws IOException 
    { 
     long l2; 
     for (long l1 = 0L; ; l1 += l2) 
     { 
     if (l1 >= paramLong); 
     do 
     { 
      return l1; 
      l2 = this.in.skip(paramLong - l1); 
      if (l2 != 0L) 
      break; 
     } 
     while (read() < 0); 
     l2 = 1L; 
     } 
    } 
    } 
    public static enum Mode1{ 

     CORRECT (new Mode1("CORRECT", 2), 
     Mode1[] arrayOfMode = new Mode1[3], 
     arrayOfMode[0] = NO_ASYNC_TASK, 
     arrayOfMode[1] = NO_DOWNLOADED_DRAWABLE, 
     arrayOfMode[2] = CORRECT1); 

    } 

} 

上述代碼中的錯誤是在枚舉聲明可以任意1點,我做錯了。

我得到一個錯位的結構錯誤此模式1 [] ...

enter image description here

+1

你應該檢查LruCache(http://developer.android.com/reference/android/util/LruCache.html)它在兼容性庫中是否可用,它確實如此你需要。 – Budius

+0

嗯我在枚舉聲明中有錯誤什麼是LruCache的幫助? – user1844638

+1

對不起,我表達自己錯了。我並不是說整個代碼。我的意思是你可以替換'ConcurrentHashMap >'和其他所有與通過LruCache緩存位圖有關的其他所有內容,這些都是爲這種方式開發的。這只是一個改善代碼的其他領域的評論,我不知道的實際答案。 – Budius

回答

1

更好的,你可以嘗試一個簡單的HTTP方法來實現這一目標。你可以得到這個簡單的項目來實現這個here