【问题标题】:My Gallery Lags a lot when i try to load images from sd card(Android Recyclerview)当我尝试从 sd 卡加载图像时,我的图库滞后很多(Android Recyclerview)
【发布时间】:2017-07-25 15:05:05
【问题描述】:

我正在尝试使用 Recycler 视图和 Sub Sampling Gallery 来实现 Gallery 应用程序。 由于我的图像计数约为 850。当我尝试将图像加载到图库时,图库滞后。

这是我的 Recyclerview 适配器:-

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolders> {

private ArrayList<String> yeniliste;
private Context context;

public RecyclerViewAdapter(Context context, ArrayList<String> itemList) {
    this.yeniliste = itemList;
    this.context = context;
}

@Override
public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.gallery_item, null);
    RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView);
    return rcv;
}

@Override
public void onBindViewHolder(final RecyclerViewHolders holder, final int position) {
    try {
        Bitmap bitmap = BitmapFactory.decodeFile(yeniliste.get(position));
        holder.countryPhoto.setImage(ImageSource.bitmap(bitmap).dimensions(50,50));
    }catch (Exception e){
        e.printStackTrace();
    }

    holder.countryPhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(v.getContext(),GalleryFullImage.class);
            intent.putExtra("realid",String.valueOf(holder.getAdapterPosition()));
            v.getContext().startActivity(intent);
        }
    });
}

@Override
public int getItemCount() {
    return this.yeniliste.size();
}


public static class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{

    public SubsamplingScaleImageView countryPhoto;

    public RecyclerViewHolders(View itemView) {
        super(itemView);
        countryPhoto = (SubsamplingScaleImageView)itemView.findViewById(R.id.country_photo);
    }

    @Override
    public void onClick(View view) {
        Toast.makeText(view.getContext(), "Clicked Country Position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();

    }

}

public void removeItem(int position)
{
    yeniliste.remove(position);
    notifyDataSetChanged();
}}

【问题讨论】:

  • 这可能需要太长时间:“Bitmap bitmap = BitmapFactory.decodeFile(yeniliste.get(position));”尝试使用像 picasso 或 glide 这样的库。主要原因是在主线程中完成。如果您不想使用库,则需要在不同的线程中执行该操作
  • 我尝试用毕加索加载,但是图片没有加载
  • 你试过滑翔吗:stackoverflow.com/questions/34443171/…。如果是毕加索,你可以检查一下:stackoverflow.com/questions/24097576/…
  • 但是无论如何.. 原因是解码到位图的操作很昂贵,因此您需要在不同的线程中执行此操作。这些库以干净的方式为您做到这一点
  • String completePath = yeniliste.get(position);文件文件 = 新文件(完整路径); Uri imageUri = Uri.fromFile(file); Glide.with(context) .load(imageUri) .into(holder.countryPhoto);

标签: android image performance android-recyclerview


【解决方案1】:
Bitmap bitmap = BitmapFactory.decodeFile(yeniliste.get(position));

这个调用有一些问题:

首先,加载到内存时你不是downscaling the image。如果您的应用程序开始抛出大量内存不足异常,我不会感到惊讶。

其次,您在 UI 线程中加载图像,这是一项昂贵的操作,并且会导致您遇到的延迟:您的应用在从磁盘加载图像时将无法渲染新帧。您需要使用后台线程来完成这项工作。最常见的方法是使用异步任务,here 描述了一个示例。

但最好的选择是使用库来为您处理这个问题。我真的推荐Glide。它已经可以处理内存缩减、后台加载、用于快速重新加载的缓存,此外它还有一个非常直观的 API。

这段代码:

Bitmap bitmap = BitmapFactory.decodeFile(yeniliste.get(position));
holder.countryPhoto.setImage(ImageSource.bitmap(bitmap).dimensions(50,50);

会变成:

GlideApp.with(context).load(eniliste.get(position)).override(50,50).centerCrop().into(new SimpleTarget<Bitmap>(50, 50) {
        @Override
        public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
         holder.countryPhoto.setImage(ImageSource.bitmap(bitmap));
        );

由于您没有使用简单的 ImageView 作为位图持有者,因此您需要使用 custom target implementation

如果您在执行此操作时遇到问题,我真的建议您阅读文档或作为有关 glide 的问题。

【讨论】:

  • String completePath = yeniliste.get(position);文件文件 = 新文件(完整路径); Uri imageUri = Uri.fromFile(file); Glide.with(context) .load(imageUri) .into(holder.countryPhoto); ......图像未使用 Glide 加载。我做对了吗?
  • 您用来加载图像的上下文是否有效?您是否出于某种原因将其销毁?
  • 这是什么 SubsamplingScaleImageView ?
  • 它是像 Glide 一样的库,可以有效地加载图像。
  • 好的,它是一个ImageView,支持放大、缩小等。试试我编辑的版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多