LINUX.ORG.RU

Android UIL плохо работает

 


0

1

Загружаю 10 картинок из интернета, использую universal image loader(UIL) для кеширования. Эти 10 картинок в списке, проблема в том что при скроллинге сначала они подгружаются через секунду примерно, а дальше и вовсе секунд через 5-10. Вот код адаптера

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.video_preview_item, parent, false);

        TextView textView = (TextView) rowView.findViewById(R.id.textView);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView);

        final FrameLayout frameLayout = (FrameLayout) rowView.findViewById(R.id.frameLayout);
        frameLayout.getLayoutParams().height = (int) (values[position].imageHeight * 0.8f);
        

        
        DisplayImageOptions options = new DisplayImageOptions.Builder().
                cacheOnDisk(true).
                cacheInMemory(false).
                delayBeforeLoading(0).
                bitmapConfig(Bitmap.Config.RGB_565).
                resetViewBeforeLoading(false).
                postProcessor(new BitmapProcessor() {
                    @Override
                    public Bitmap process(Bitmap bmp) {
                        int width = context.getResources().getDisplayMetrics().widthPixels;
                        int height = width*bmp.getHeight()/bmp.getWidth();
                        return Bitmap.createScaledBitmap(bmp, width, height, false);
                    }
                }).
                build();
        
        if(position + 1 != values.length) {   // Это попытка загружать следующею картинку, эффекта не принесло 
            ImageLoader.getInstance().loadImage(values[position+1].imageUrl, options, new SimpleImageLoadingListener() {
                        @Override
                        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                            // Do whatever you want with Bitmap
                        }
                    });
        }

        ImageLoader.getInstance().displayImage(values[position].imageUrl, imageView, options , new ImageLoadingListener() {
                    @Override
                    public void onLoadingStarted(String imageUri, View view) {
                        //...
                    }
                    @Override
                    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                        //...
                    }
                    @Override
                    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

                        int clientWidth = context.getResources().getDisplayMetrics().widthPixels;
                        int calHeight = loadedImage.getHeight() * clientWidth/loadedImage.getWidth();
                        values[position].imageHeight = calHeight;
                        frameLayout.getLayoutParams().height = (int) (values[position].imageHeight * 0.8f);
                        FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();
                        params.height = values[position].imageHeight;
                        //((FrameLayout.LayoutParams) view.getLayoutParams()).setMargins(40,0,0,0);
                        //params.setMargins(0, 0, 0, 0);
                        //Log.e("what", "")
                    }
                    @Override
                    public void onLoadingCancelled(String imageUri, View view) {
                        //...
                    }
                }
        );
        

        textView.setText(values[position].clipName);


        return rowView;
    }
★★★

Тестовое задание на работу вроде тебе дали, а решаем всем ЛОРом. Ну и какой из тебя после этого девелопер?

Jefail ★★★★ ()

1) view каждый раз создаётся в getView, используй паттерн viewholder и не забывай про convertview
2) слишком много работы в getView - этот код вызывается при прокрутке в потоке пользователя и тормозит, очевидно. Вынеси оттуда повторяющиеся действия которые не зависят от параметров getView и выполни их один раз

TERRANZ ★★★★ ()
Последнее исправление: TERRANZ (всего исправлений: 2)
Ответ на: комментарий от TERRANZ

1) view каждый раз создаётся в getView, используй паттерн viewholder и не забывай про convertview

А лучше вообще RecycleView использовать.

mono ★★★★★ ()
Ответ на: комментарий от TERRANZ

Вынеси оттуда повторяющиеся действия которые не зависят от параметров getView и выполни их один раз

Там нет такого, и сам список не тормозит, тормозит подгрузка картинок из кеша, сама загрузка картинок асинхронная и в другом потоке.

abs ★★★ ()
Ответ на: комментарий от TERRANZ

viewholder

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

abs ★★★ ()
Последнее исправление: abs (всего исправлений: 1)
Ответ на: комментарий от TERRANZ

viewholder

О да, эта штука мне помогла, я так понял что оно сохраняет ссылку на imageView и запрещает сборщику мусора удалять картинку?

abs ★★★ ()
Ответ на: комментарий от abs

У тебя вместо использования старых стоздаются новые вьюхи, которые забирают память. Из-за этого уменьшается кэш для картинок, картинки беруться не из кэша и все начитает дергаться. Если ты правильно реализовал патерн viewholder, то он будет переипользовать старые вьюхи.

С ЮИЛ вроде как идут вменяемые примеры загрузки картинок в списке...

F457 ★★★★ ()
Ответ на: комментарий от abs

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

TERRANZ ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.