2014-05-07 6 views
5

मेरे कोड है:एंड्रॉइड: वॉली: मुख्य धागे से वॉली छवि लोडर क्यों लागू किया जाना चाहिए?

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

मैं अच्छी तरह से काम कर रहा उम्मीद है, लेकिन यह IllegalStateException अपवाद फेंक देते हैं। तो, वॉली पूर्ण स्रोत खोलें, इसे ढूंढें।

[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; 
} 

मैं throwIfNotOnMainThread() .. समझ में नहीं आता क्यों वॉली imageLoader मुख्य थ्रेड से लागू किया जाना चाहिए?

धन्यवाद।

+0

java.lang.IllegalStateException: ImageLoader मुख्य थ्रेड से लागू किया जाना चाहिए। com.android.volley.toolbox.ImageLoader.get (ImageLoader.java:189) com.android.volley.toolbox पर पर com.android.volley.toolbox.ImageLoader.throwIfNotOnMainThread (ImageLoader.java:467) पर । ImageLoader.get (ImageLoader.java:171) android.os.Handler.dispatchMessage (हैंडलर.जावा:102) atroid.os.Looper.loop (Looper.java:136) atroid.os.HandlerThread पर। रन (हैंडलर थ्रेड.जावा:61) – JuL

उत्तर

2

यह गारंटी देना है कि प्रतिक्रिया कॉलबैक मुख्य UI थ्रेड पर होता है यह मानते हुए कि कॉलबैक यूआई को अपडेट करना चाहता है।

वॉली लाइब्रेरी द्वारा प्रदान किए गए ImageListener का डिफ़ॉल्ट कार्यान्वयन यूआई अपडेट करता है और इसलिए इसे मुख्य धागे से उपयोग किया जाना चाहिए।

/** 
    * 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

लेकिन यह बहुत भारी बाधा है ... – JuL

संबंधित मुद्दे