FileNotFoundException avec Universal Image Loader

Cette question porte sur cette populaire bibliothèque Android, Universal Image Loader pour Android : https://github.com/nostra13/Android-Universal-Image-Loader

  1. Je me suis assuré que WRITE_EXTERNAL_STORAGE est ajouté.
  2. J'ai activé la mémoire et le cache du disque
  3. J'ai utilisé UnlimitedDiscCache pour le cache du disque
  4. Je construis contre Android 2.2 SDK. L'exception se trouve lorsque je teste l'application sur un périphérique Android 4.1.2 Nexus S.
  5. Pour la plupart de mes images, le chargement est lisse et fin. Cependant, pour certaines images, j'ai toujours la même exception. Voici un exemple.

URL de l'image: http://i10.topit.me/l046/10046137034b1c0db0.jpg

  • Comment changer le nom de l'application par type de compilation Gradle
  • Android: modifier le texte du bouton et la couleur d'arrière-plan
  • Java.util.ConcurrentModificationException dans l'animation Android
  • Comment puis-je résoudre cette fuite de mémoire Android impliquant des threads?
  • Swipe ListView item De droite à gauche, affiche le bouton de suppression
  • Android 3 - Ajout d'un fragment à un LinearLayout: fill_parent ne fonctionne pas
  • Trace arrière:

    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) 

    Aidez-nous.

    4 Solutions collect form web for “FileNotFoundException avec Universal Image Loader”

    Suivre:

    J'ai finalement résolu mon problème sans changer une ligne de code de serveur. Ce que j'ai fait, c'est remplacer l' utilitaire URLConnectionImageDownloader par défaut avec HttpClientImageDownloader

    Exemple de code:

      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(); 

    🙂

    Recherchez la mise en œuvre de libcore.net.http.HttpURLConnectionImpl.getInputStream()

      @Override public InputStream getInputStream() throws IOException { if (!doInput) { throw new ProtocolException("This protocol does not support input"); } retrieveResponse(); /* * if the requested file does not exist, throw an exception formerly the * Error page from the server was returned if the requested file was * text/html this has changed to return FileNotFoundException for all * file types */ if (responseCode >= HTTP_BAD_REQUEST) { throw new FileNotFoundException(url.toString()); } if (responseBodyIn == null) { throw new IOException("No response body exists; responseCode=" + responseCode); } return responseBodyIn; } 

    Selon cela, il peut lancer FileNotFoundException même si une erreur de serveur se produit ou n'est pas autorisée.

    Je n'ai pas trouvé la valeur de HTTP_BAD_REQUEST mais c'est toujours 400. Lien de code source http://www.java2s.com/Open-Source/Android/android-core/platform-libcore/org/apache/harmony/luni/internal/ Net / www / protocol / http / HttpURLConnectionImpl.java.htm

    La seule chose que vous pouvez faire est de désactiver la journalisation du tout par L.disableLogging() . Ou modifiez les sources selon vos besoins. Source: réponse de nostra13 pour ce problème

    Cette configuration est personnalisée. Vous pouvez régler toutes les options, vous pouvez régler certaines d'entre elles, ou vous pouvez créer une configuration par ImageLoaderConfiguration.createDefault(this); méthode.

      public static void initImageLoader(Context context) { ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context); config.threadPriority(Thread.NORM_PRIORITY - 2); config.denyCacheImageMultipleSizesInMemory(); config.diskCacheFileNameGenerator(new Md5FileNameGenerator()); config.diskCacheSize(50 * 1024 * 1024); // 50 MiB config.tasksProcessingOrder(QueueProcessingType.LIFO); config.writeDebugLogs(); // Remove for release app // Initialize ImageLoader with configuration. ImageLoader.getInstance().init(config.build()); } 

    J'espère que cela vous aidera.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.