Эффективный способ загрузить большое количество одного и того же изображения в ReyclerView - PullRequest
0 голосов
/ 28 октября 2018

Я разработал приложение для чата.Он использует RecyclerView, чтобы показать информацию чата.Это в точности как мессенджер в фейсбуке.

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

Я использую Picasso для загрузки изображения.

Picasso.get()
                    .load("https://domain/images/profile_picture/" + otherImage)
                    .networkPolicy(NetworkPolicy.OFFLINE)
                    .transform(new CircleTransform())
                    .into(imageView, new Callback() {
                        @Override
                        public void onSuccess() {

                        }

                        @Override
                        public void onError(Exception e) {

                            int placeHo;

                            if(otherGender.equals("female"))
                                placeHo = R.drawable.ic_female_color;
                            else
                                placeHo = R.drawable.ic_male_color;


                            Picasso.get()
                                    .load("https://domain/images/profile_picture/" + otherImage)
                                    .error(placeHo)
                                    .transform(new CircleTransform())
                                    .centerCrop(Gravity.TOP)
                                    .into(imageView, new Callback() {
                                        @Override
                                        public void onSuccess() {

                                        }

                                        @Override
                                        public void onError(Exception e) {
                                            Log.v("Picasso","Could not fetch image");
                                        }
                                    });
                        }
                    });

Есть ли эффективный способ показать изображение?так как он показывает то же изображение (изображение профиля пользователя).

Ответы [ 4 ]

0 голосов
/ 28 октября 2018

Если вы используете одно и то же изображение во всех видах одного и того же viewType, тогда загрузите изображение в методе onCreateViewHolder адаптера, а не в onBindViewHolder.

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

0 голосов
/ 28 октября 2018

оставьте его статическим или вы можете установить его во время инициализации, не меняя его каждый раз в окне просмотра

извините за мой английский и формат письма

0 голосов
/ 28 октября 2018

Вы должны отложить первую процедуру получения изображения, когда событие RecyclerView.OnChildAttachStateChangeListener() сигнализирует о добавлении дочернего элемента.Очевидно, что событие запускается для каждого из первых видимых предметов.Самый правильный способ отложить что-то подобное - создать обработчик, а затем send/enqueue a Handler.sendMessage(Message.obtain(..)) по одному для каждого видимого объекта).Внутри обработчика вы получите это сообщение, и там вы сможете выполнить действие Пикассо.

Затем вы должны решить, загружать ли другие (еще не видимые элементы) изображения сразу или просто подготовить изображение только тогда, когда онотребуется Recycler.

0 голосов
/ 28 октября 2018

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

Смотрите, если ваше изображение в чате составляет около 50-100dp, то вы должны использовать изображение с таким же разрешением. Возможно, вы загружаете оригинальное изображение.

AFAIK Я использую Glide поверх Picasso, потому что Glide оптимизирует загруженное изображение, как размер ImageView.

См. Glide doc

Основная задача Glide - сделать прокрутку любого вида списка изображения максимально плавные и быстрые, но Glide также эффективен для почти в любом случае, когда вам нужно выбрать, изменить размер и отобразить пульт изображение.

Вам не нужно беспокоиться о кеше в Picasso и Glide. Кэширование включено в Picasso по умолчанию, поэтому, если к тому же изображению снова будет применен запрос, он будет выбран из кеша.

Решение 1 (с использованием Piccaso)

Изменение размера изображения столько, сколько вам нужно.

Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .resize(100, 100) // resizes the image to these dimensions (in pixel). does not respect aspect ratio
    .into(imageViewResize);

Раствор 2 (с использованием Glide)

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

...