使用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测试的输出。)
我能做些什么来加快速度吗?我做错了吗?