毕加索的性能问题时,调整多个图像的大小



我有一个活动,需要加载多个图像并调整它们的大小,使它们适合屏幕宽度。

我尝试将图像加载到this.frameHolder中,这是一个NestedScrollView中的LinearLayout,并与屏幕宽度相匹配。

下面的代码是工作的,但使应用程序非常慢,一旦有更多的图像。

public void displayImages(List<ImageContent> images) {
for(ImageContent img:images) {
//Create an new view for image
ImageView imgView = new ImageView(this);
this.frameHolder.addView(imgView);
//Create a client with custom header for this image
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(chain -> {
Request.Builder newRequest = chain.request().newBuilder();
newRequest.addHeader(img.getHeaderKey(), img.getHeaderValue());
return chain.proceed(newRequest.build());
}).build();

//Create a picasso instance for this client
Picasso.Builder builder = new Picasso.Builder(this).downloader(new OkHttp3Downloader(client));
Picasso pic = builder.build();
//Load and resize the image to fit screen width
pic.load(img.getUrlContentData()).resize(frameHolder.getWidth(), 0).into(imgView);
}
}

我如何加载多个图像并使它们适合屏幕宽度,而不会降低性能太多?如果可能的话,我愿意接受毕加索以外的其他方案。

我最终放弃了使用库,因为@Qasim Malik建议我尝试过Glide和Fresco作为替代方案,但我仍然有类似的问题。

因此,由于我无法使用库来完成此操作,因此我通过直接处理请求和图像调整大小来自己完成:

private final static OkHttpClient client = new OkHttpClient();
public void displayImages(List<ImageContent> images) {
for(ImageContent img:images) {
ImageView imgView = new ImageView(this);
this.frameHolder.addView(imgView);
Request.Builder requestBuilder = new Request.Builder()
.addHeader(img.getHeaderKey(), img.getHeaderValue())
.url(content.getUrlContentData());

client.newCall(requestBuilder.build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
loadFailed();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Bitmap bitmap = BitmapFactory.decodeStream(response.body().byteStream());
float widthInitial =  bitmap.getWidth() ;
float heightInitial =  bitmap.getHeight() ;
Bitmap resizedImage = Bitmap.createScaledBitmap(bitmap, frameHolder.getWidth(), Math.round(frameHolder.getWidth() * (heightInitial / widthInitial)), true);

imgView.setImageBitmap(resizedImage);
}
});
}
}

这个工作很好,没有更多的性能问题,但我仍然不确定为什么库这么慢…

最新更新