#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 (), чтобы лучше загружать изображения из хранилища?