Search code examples
javaandroiduniversal-image-loader

FileNotFoundException with Universal Image Loader


This question is about this popular Android library, Universal Image Loader for Android: https://github.com/nostra13/Android-Universal-Image-Loader

  1. I made sure WRITE_EXTERNAL_STORAGE is added.
  2. I enabled both memory and disk cache
  3. I used UnlimitedDiscCache for disk cache
  4. I'm building against Android 2.2 SDK. The exception is found when I'm testing the app on a Android 4.1.2 Nexus S device.
  5. For most of my images, the loading is smooth and fine. However, for certain images, I always get the same exception. Below is an example.

Image URL: http://i10.topit.me/l046/10046137034b1c0db0.jpg

Back trace:

01-14 00:24:42.125: 

ERROR/ImageLoader(1671): http://i10.topit.me/l046/10046137034b1c0db0.jpg

java.io.FileNotFoundException: http://i10.topit.me/l046/10046137034b1c0db0.jpg

at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)

at com.nostra13.universalimageloader.core.download.URLConnectionImageDownloader.getStreamFromNetwork(URLConnectionImageDownloader.java:40)

at com.nostra13.universalimageloader.core.download.ImageDownloader.getStream(ImageDownloader.java:27)

at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.saveImageOnDisc(LoadAndDisplayImageTask.java:296)

at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:204)

at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:128)

at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)

Please help.


Solution

  • Follow up:

    I finally solved my problem without changing one line of server code. What I did is replacing the default URLConnectionImageDownloader with HttpClientImageDownloader

    Code sample:

            HttpParams params = new BasicHttpParams();
            // Turn off stale checking. Our connections break all the time anyway,
            // and it's not worth it to pay the penalty of checking every time.
            HttpConnectionParams.setStaleCheckingEnabled(params, false);
            // Default connection and socket timeout of 10 seconds. Tweak to taste.
            HttpConnectionParams.setConnectionTimeout(params, 10 * 1000);
            HttpConnectionParams.setSoTimeout(params, 10 * 1000);
            HttpConnectionParams.setSocketBufferSize(params, 8192);
    
            // Don't handle redirects -- return them to the caller. Our code
            // often wants to re-POST after a redirect, which we must do ourselves.
            HttpClientParams.setRedirecting(params, false);
            // Set the specified user agent and register standard protocols.
            HttpProtocolParams.setUserAgent(params, "some_randome_user_agent");
            SchemeRegistry schemeRegistry = new SchemeRegistry();
            schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
    
            ClientConnectionManager manager = new ThreadSafeClientConnManager(params, schemeRegistry);
    
    
            ImageLoaderConfiguration config =
                    new ImageLoaderConfiguration
                            .Builder(MainActivity.sharedMainActivity.getApplicationContext())
                            .defaultDisplayImageOptions(defaultOptions)
                            .discCache(new UnlimitedDiscCache(cacheDir))
                            .threadPoolSize(1)
                            .memoryCache(new WeakMemoryCache())
                            .imageDownloader(new HttpClientImageDownloader(new DefaultHttpClient(manager, params)))
                            .build();
    

    :)