Android:Volley:为什么必须从主线程调用volley imageLoader?

七月

我的代码是:

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

我不明白th​​rowIfNotOnMainThread()。为什么必须从主线程调用凌空imageLoader?

谢谢。

曼尼什·穆利马尼(Manish Mulimani)

这是为了确保响应回调发生在主UI线程上,前提是该回调将要更新UI。

Volley库提供ImageListener的默认实现会更新UI,因此必须在主线程中使用它。

   /**
     * 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);
                }
            }
        };
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Volley Library的ImageLoader?

来自分类Dev

imageLoader子类的调用方法

来自分类Dev

添加ImageLoader时getInstance(this)中出现Android Volley错误

来自分类Dev

Android Studio 关于 ImageLoader 的问题

来自分类Dev

Volley ImageLoader对某些HTTPS URL给出403响应

来自分类Dev

使用前必须使用配置初始化ImageLoader

来自分类Dev

Android中带有Picasso库的Multi ImageLoader

来自分类Dev

ListView中的Android Universal ImageLoader滚动速度非常慢

来自分类Java

Android-ImageLoader必须在UIL中使用之前通过配置进行初始化

来自分类Dev

Android-Universal-Image-Loader和ImageLoader有什么区别

来自分类Java

Android,Volley Request,响应阻塞了主线程

来自分类Dev

凌空,ImageLoader.ImageListener中的onResponse调用了多少次

来自分类Dev

是否有一个选项可以使ImageLoader.display(...)在图像加载之前调用块当前(UI)线程?

来自分类Dev

Swift异步Imageloader

来自分类Dev

更新通用imageloader缓存

来自分类Dev

Angular 新手:调试 Typescript 错误“'imageLoader' 的所有声明必须具有相同的类型参数”

来自分类Java

Android错误:必须从主线程调用recreate()

来自分类Java

Imageloader几个图像到ViewPager

来自分类Dev

getView方法中的imageloader错误

来自分类Dev

Android Volley 为什么JsonObjectRequest 不调用onResponse

来自分类Dev

QCoreApplication :: processEvents-为什么必须仅从主线程调用它?

来自分类Dev

为什么不调用Volley的onResponse

来自分类Dev

ListView-ImageLoader向上滚动列表/项目

来自分类Dev

为什么主线程还调用线程池的execute()方法?

来自分类Dev

函数只能在主线程中调用,为什么?

来自分类Dev

Unity Firebase SetCurrentScreen 必须从主线程调用

来自分类Dev

-[UIApplication委托]必须仅从主线程调用

来自分类Dev

如何使用Universal ImageLoader加载图像而不显示

来自分类Dev

THREE.js:POST请求URL到ImageLoader吗?

Related 相关文章

  1. 1

    如何使用Volley Library的ImageLoader?

  2. 2

    imageLoader子类的调用方法

  3. 3

    添加ImageLoader时getInstance(this)中出现Android Volley错误

  4. 4

    Android Studio 关于 ImageLoader 的问题

  5. 5

    Volley ImageLoader对某些HTTPS URL给出403响应

  6. 6

    使用前必须使用配置初始化ImageLoader

  7. 7

    Android中带有Picasso库的Multi ImageLoader

  8. 8

    ListView中的Android Universal ImageLoader滚动速度非常慢

  9. 9

    Android-ImageLoader必须在UIL中使用之前通过配置进行初始化

  10. 10

    Android-Universal-Image-Loader和ImageLoader有什么区别

  11. 11

    Android,Volley Request,响应阻塞了主线程

  12. 12

    凌空,ImageLoader.ImageListener中的onResponse调用了多少次

  13. 13

    是否有一个选项可以使ImageLoader.display(...)在图像加载之前调用块当前(UI)线程?

  14. 14

    Swift异步Imageloader

  15. 15

    更新通用imageloader缓存

  16. 16

    Angular 新手:调试 Typescript 错误“'imageLoader' 的所有声明必须具有相同的类型参数”

  17. 17

    Android错误:必须从主线程调用recreate()

  18. 18

    Imageloader几个图像到ViewPager

  19. 19

    getView方法中的imageloader错误

  20. 20

    Android Volley 为什么JsonObjectRequest 不调用onResponse

  21. 21

    QCoreApplication :: processEvents-为什么必须仅从主线程调用它?

  22. 22

    为什么不调用Volley的onResponse

  23. 23

    ListView-ImageLoader向上滚动列表/项目

  24. 24

    为什么主线程还调用线程池的execute()方法?

  25. 25

    函数只能在主线程中调用,为什么?

  26. 26

    Unity Firebase SetCurrentScreen 必须从主线程调用

  27. 27

    -[UIApplication委托]必须仅从主线程调用

  28. 28

    如何使用Universal ImageLoader加载图像而不显示

  29. 29

    THREE.js:POST请求URL到ImageLoader吗?

热门标签

归档