使用Universal Image Loader的FileNotFoundException

Di *_* Wu 7 java android universal-image-loader

这个问题是关于这个流行的Android库,Android的通用图像加载器:https://github.com/nostra13/Android-Universal-Image-Loader

  1. 我确定添加了WRITE_EXTERNAL_STORAGE.
  2. 我启用了内存和磁盘缓存
  3. 我使用UnlimitedDiscCache进行磁盘缓存
  4. 我正在构建Android 2.2 SDK.当我在Android 4.1.2 Nexus S设备上测试应用程序时,会发现例外情况.
  5. 对于我的大多数图像,加载是平滑和精细的.但是,对于某些图像,我总是得到相同的例外.以下是一个例子.

图片网址:http://i10.topit.me/l046/10046137034b1c0db0.jpg

回溯:

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)
Run Code Online (Sandbox Code Playgroud)

请帮忙.

Di *_* Wu 12

跟进:

我终于在不改变一行服务器代码的情况下解决了我的问题.我所做的是替换默认URLConnectionImageDownloaderHttpClientImageDownloader

代码示例:

        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();
Run Code Online (Sandbox Code Playgroud)

:)

  • 非常感谢!!这对我很有帮助.在代码中只需要一件事,需要在最后一行中使用上下文:`.imageDownloader(new HttpClientImageDownloader(msContext,new DefaultHttpClient(manager,params))) (5认同)