2014-05-07 12 views
5

Mã của tôi là:Android: Volley: Tại sao volley imageLoader phải được gọi từ chuỗi chính?

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

tôi mong đợi hoạt động tốt, nhưng nó ném IllegalStateException ngoại lệ. Vì vậy, hãy mở nguồn đầy đủ về bóng chuyền, tìm mục này.

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

Tôi không hiểu throwIfNotOnMainThread() .. Tại sao imageLoader bóng phải được gọi từ các chủ đề chính?

Cảm ơn.

+0

java.lang.IllegalStateException: ImageLoader phải được gọi từ chuỗi chính. tại com.android.volley.toolbox.ImageLoader.throwIfNotOnMainThread (ImageLoader.java:467) tại com.android.volley.toolbox.ImageLoader.get (ImageLoader.java:189) tại com.android.volley.toolbox. ImageLoader.get (ImageLoader.java:171) tại android.os.Handler.dispatchMessage (Handler.java:102) tại android.os.Looper.loop (Looper.java:136) tại android.os.HandlerThread. chạy (HandlerThread.java:61) – JuL

Trả lời

2

Điều này đảm bảo rằng cuộc gọi lại phản hồi xảy ra trên chuỗi giao diện người dùng chính giả định rằng cuộc gọi lại sẽ muốn cập nhật giao diện người dùng.

Việc triển khai mặc định là ImageListener do thư viện Volley cập nhật giao diện người dùng và do đó nó phải được sử dụng từ chuỗi chính.

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

Nhưng đó là những ràng buộc quá nặng nề ... – JuL

Các vấn đề liên quan