2014-05-07 21 views
5

Benim kodudur:Android: Volley: Neden ana konudan volley imageLoader çağrılmalı?

class MyService extends Service{ 
    public void onCreate(){ 
      new ImageLoader(mRequestQueue, new VolleyLruCache(cacheSize)) 
              .get(url, new ImageListener(){..}); 
    } 
} 

Ben iyi çalışıyor bekliyoruz, ancak IllegalStateException İstisna atmak. Yani, volley tam kaynağını açın, bunu bulun.

[ImageLoader.java]

public ImageContainer get(String requestUrl, ImageListener imageListener, 
     int maxWidth, int maxHeight) { 
    // only fulfill requests that were initiated from the main thread. 
    throwIfNotOnMainThread(); //<- why??? 

    final String cacheKey = getCacheKey(requestUrl, maxWidth, maxHeight); 

    // Try to look up the request in the cache of remote images. 
    Bitmap cachedBitmap = mCache.getBitmap(cacheKey); 
    if (cachedBitmap != null) { 
     // Return the cached bitmap. 
     ImageContainer container = new ImageContainer(cachedBitmap, requestUrl, null, null); 
     imageListener.onResponse(container, true); 
     return container; 
    } 

    // The bitmap did not exist in the cache, fetch it! 
    ImageContainer imageContainer = 
      new ImageContainer(null, requestUrl, cacheKey, imageListener); 

    // Update the caller to let them know that they should use the default bitmap. 
    imageListener.onResponse(imageContainer, true); 

    // Check to see if a request is already in-flight. 
    BatchedImageRequest request = mInFlightRequests.get(cacheKey); 
    if (request != null) { 
     // If it is, add this request to the list of listeners. 
     request.addContainer(imageContainer); 
     return imageContainer; 
    } 

    // The request is not already in flight. Send the new request to the network and 
    // track it. 
    Request<?> newRequest = 
     new ImageRequest(requestUrl, new Listener<Bitmap>() { 
      @Override 
      public void onResponse(Bitmap response) { 
       onGetImageSuccess(cacheKey, response); 
      } 
     }, maxWidth, maxHeight, 
     Config.RGB_565, new ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       onGetImageError(cacheKey, error); 
      } 
     }); 

    mRequestQueue.add(newRequest); 
    mInFlightRequests.put(cacheKey, 
      new BatchedImageRequest(newRequest, imageContainer)); 
    return imageContainer; 
} 

Ben voleybolu imageLoader ana iş parçacığı gelen çağrılması gerektiğinde Neden throwIfNotOnMainThread() .. anlamıyorum?

Teşekkürler.

+0

java.lang.IllegalStateException: ImageLoader ana iş parçacığından çağrılmalı. Com.android.volley.toolbox.ImageLoader.get adresinde com.android.volley.toolbox.ImageLoader.throwIfNotOnMainThread (ImageLoader.java:467) adresinden (ImageLoader.java:467) com.android.volley.toolbox adresindeki . Android.os.Looper.loop (Looper.java:136) adresinde, android.os.HandlerThread adresinde bulunan ImageLoader.get (ImageLoader.java:171) , android.os.Handler.dispatchMessage (Handler.java:102) . koş (HandlerThread.java:61) – JuL

cevap

2

Geri bildirimin, kullanıcı arabirimini güncelleştirmek isteyeceği varsayılarak, ana UI iş parçacığında yanıt geri bildiriminin gerçekleştirileceğini garanti etmektir.

Volley kitaplığı tarafından sağlanan ImageListener varsayılan uygulaması, UI'yi günceller ve dolayısıyla ana iş parçacığından kullanılması gerekir.

/** 
    * The default implementation of ImageListener which handles basic functionality 
    * of showing a default image until the network response is received, at which point 
    * it will switch to either the actual image or the error image. 
    * @param imageView The imageView that the listener is associated with. 
    * @param defaultImageResId Default image resource ID to use, or 0 if it doesn't exist. 
    * @param errorImageResId Error image resource ID to use, or 0 if it doesn't exist. 
    */ 
    public static ImageListener getImageListener(final ImageView view, 
      final int defaultImageResId, final int errorImageResId) { 
     return new ImageListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       if (errorImageResId != 0) { 
        view.setImageResource(errorImageResId); 
       } 
      } 
      @Override 
      public void onResponse(ImageContainer response, boolean isImmediate) { 
       if (response.getBitmap() != null) { 
        view.setImageBitmap(response.getBitmap()); 
       } else if (defaultImageResId != 0) { 
        view.setImageResource(defaultImageResId); 
       } 
      } 
     }; 
    } 
+1

Ama çok ağır kısıtlamalar ... – JuL

İlgili konular