2013-03-05 51 views
0

使用UIL版本1.8.0加載Twitter個人資料圖像URL: http://api.twitter.com/1/users/profile_image/smashingmag.jpg?size=bigger通用圖像裝載機和302重定向

與光盤和存儲器的高速緩存。圖像無法加載和存儲伴隨302重定向到光盤緩存文件中的html。圖像從未加載或解碼成功(我的SimpleImageLoadingListener的onLoadingFailed方法被調用了每個Twitter配置文件圖像url)。任何人都可以使用UIL加載一個簡單的Twitter圖片網址?

以下是一個URL我的緩存文件的內容:

貓的/ mnt/SD卡/ MyCache/CacheDir/1183818163

<html><body>You are being <a href="https://si0.twimg.com/profile_images/3056708597/6438618743e2b2d7d663fd43412bdae8_bigger.png">redirected</a>.</body></html> 

這裏是我的配置:

File cacheDir = StorageUtils.getOwnCacheDirectory(FrequencyApplication.getContext(), "MyCache/CacheDir"); 

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
    .cacheInMemory() 
    .cacheOnDisc() 
    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) 
    .build(); 

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(FrequencyApplication.getContext()) 
    .memoryCacheExtraOptions(480, 800) 
    .threadPoolSize(20) 
    .threadPriority(Thread.MIN_PRIORITY) 
    .offOutOfMemoryHandling() 
    .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) 
    .discCache(new TotalSizeLimitedDiscCache(cacheDir, 30 * 1024 * 1024)) 
    .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) 
    .imageDownloader(new BaseImageDownloader(MyApplication.getContext(), 20 * 1000, 30 * 1000)) 
    .tasksProcessingOrder(QueueProcessingType.FIFO) 
    .defaultDisplayImageOptions(defaultOptions) 
    .build(); 
ImageLoader.getInstance().init(config); 

回答

3

看起來HttpURLConnection無法自動處理從HTTP到HTTPS的重定向(link)。我將在下一個lib版本中修復它。

修正了現在 - 延長BaseImageDownloader並將其納入配置:

public class MyImageDownloader implements BaseImageDownloader { 
    @Override 
    protected InputStream getStreamFromNetwork(URI imageUri, Object extra) throws IOException { 
     HttpURLConnection conn = (HttpURLConnection) imageUri.toURL().openConnection(); 
     conn.setConnectTimeout(connectTimeout); 
     conn.setReadTimeout(readTimeout); 
     conn.connect(); 
     while (conn.getResponseCode() == 302) { // >=300 && < 400 
      String redirectUrl = conn.getHeaderField("Location"); 
      conn = (HttpURLConnection) new URL(redirectUrl).openConnection(); 
      conn.setConnectTimeout(connectTimeout); 
      conn.setReadTimeout(readTimeout); 
      conn.connect(); 
     } 
     return new FlushedInputStream(conn.getInputStream(), BUFFER_SIZE); 
    } 
} 
+0

謝謝!這正是問題所在。而你的修復效果很好。 – 2013-03-05 18:22:22

+0

這是給conn.getResponseCode()== 500 – mohitum 2016-01-29 09:26:49