Android Volley ImageLoader :: get非常慢并且阻止了UI

时间:2015-10-03 17:47:54

标签: android performance android-volley

使用Volley在RecyclerView中加载一些图像时遇到性能问题。

Recycler View的每个元素都是包含背景图片和标题的新闻。

元素可以有不同的大小,这就是我没有使用ListView或GridView的原因。

对于recycler视图中的每个元素,我运行一些与此类似的代码来检索图像:

ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {

        imageView.getViewTreeObserver().removeOnPreDrawListener(this);
        int imageWidth = imageView.getMeasuredWidth();
        int imageHeight = imageView.getMeasuredHeight();

        long now = System.currentTimeMillis();
        imageLoader.get(
                imageUrl,
                new ImageLoader.ImageListener() {
                    @Override
                    public void onResponse(final ImageLoader.ImageContainer response, boolean isImmediate) {
                        long now2 = System.currentTimeMillis();
                        Optional<Bitmap> bitmapOptional = Optional.fromNullable(response.getBitmap());

                        if (bitmapOptional.isPresent()) {
                            settableFuture.set(bitmapOptional.get());
                        } else {
                            if (!isImmediate) {
                                settableFuture.setException(new Exception("Bitmap not present"));
                            }
                            //otherwise we will wait for the network call before setting the future to exception
                        }
                        Log.e("TIMING", "onResponse took: "+(System.currentTimeMillis()-now2)+"ms" );
                    }

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        settableFuture.setException(new Exception("Bitmap loading error"));
                    }
                },
                imageWidth,
                imageHeight
        );
        Log.e("TIMING", "imgLoader.get took: "+(System.currentTimeMillis()-now)+"ms" );
        return true;
    }
});

正如您在代码中看到的,我需要获得ImageView的确切维度,以便能够通过ImageLoader请求正确的图像。

然而,在滚动回收站视图时,性能非常糟糕,我注意到了几条消息:

I/Choreographer: Skipped 165 frames!  The application may be doing too much work on its main thread.

我决定测试代码的不同部分的执行时间,我发现imageLoader.get通常需要在200ms到850ms之间完成,它似乎在主线程中执行,因此减慢了UI(请参阅此处http://pastebin.com/e0GzrUpp测试的输出。)

我能做些什么来加快速度吗?我做错了吗?

0 个答案:

没有答案