Как загрузить много изображений в Recycle View без проблем в Android

#android

#Android

Вопрос:

я использую библиотеку Glide для загрузки моих изображений из хранилища в ImageView с помощью RecyclerView

все хорошо

но когда количество изображений велико, приложение разбилось или должно ждать так много, чтобы полностью загрузить activity, это мой код

     public static File DIR_IMG = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "MyHairSamples");

    private void readExistingImages(){
    File[] images;
    try {
        images= DIR_IMG.listFiles();
        for (int i = 0; i < images.length; i  ) {
            if (images[i].isFile() amp;amp; images[i].length() > 50L) {
                Bitmap b = BitmapFactory.decodeFile(images[i].getAbsolutePath());
                addImage(b, "5", images[i].getName());
            }
            else{
                images[i].delete();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  

и я использую этот метод в методе onCreate

и это мой код адаптера

 @Override
public void onBindViewHolder(@NonNull MyViewHolder viewHolder, int i) {
    viewHolder.title.setText(arrayList.get(i).getImageTitle());
    viewHolder.thumbnail.setLabelFor(i);
    Glide.with(context)
            .load(arrayList.get(i).getImage())
            .into(viewHolder.thumbnail);
}
  

Ответ №1:

При большом разрешении изображений загрузка будет медленной, и даже ваше приложение выйдет из строя.

Таким образом, вы можете изменить размер своего набора изображений следующим образом

   Glide.with(context)
        .load(arrayList.get(i).getImage())
        .apply(new RequestOptions().override(400, 400))
        .into(viewHolder.thumbnail);
  

Редактировать

   RequestOptions reqOpt = RequestOptions
                        .fitCenterTransform()
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .override(300,300)
  

Комментарии:

1. tnx но дело не в разрешении .. дело в количестве изображений

2. Вы можете попробовать кэшировать свои изображения после их загрузки в первый раз. Glide предлагает вам это. Взгляните на отредактированный ответ.

3. Также вы можете просто сжать растровое изображение перед добавлением его в свой список

Ответ №2:

Загружайте изображения внутри uithread, это не прерывает основной поток.

Используйте приведенный ниже код.

     context.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Glide.with(context)
        .load(arrayList.get(i).getImage())
        .into(viewHolder.thumbnail);
            }
        });
  

Комментарии:

1. Это легко реализовать, вы можете увидеть мой код, я просто загружаю изображение в UIThread

2. В вашем коде, если в основной поток загружается несколько изображений, возможно, приложение застряло, поэтому я рекомендую вам загрузить изображение в uithread.

3. я использую его, но он все еще застрял! как я могу изменить свой метод readExistingImages (), чтобы лучше загружать изображения из хранилища?