마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

UIL 라이브러리 사용 시, 이미지 캐싱??질문좀..

0 추천

안녕하세요.

UIL을 사용해서 로컬 이미지를 뿌려주는 작업을 하는데요..

'사진 선택'이라는 버튼을 누르면 전체사진이 GridView로 보여지는건데..(Column : 3)

config와 옵션은 아래와 같습니다. 캐싱 관련부분을 True로 세팅했는데..

여기서 질문...

예들들어 1000개의 이미지가 있다면

첫번째 줄부터 한 대여섯번째 줄까지 로딩이 되어 이미지가 보이집니다.

그리고 스크롤을 내리면 그에 맞춰서 이미지들이 하나 둘씩 로딩되어집니다.

 

그런데 그 이후에 스크롤을 좀 더 내린뒤, 다시 맨 첫번째 줄로 올라오면

이미 로딩되었던 이미지들이 재로딩? 되는거처럼 보입니다. 이유가 뭘까요?

어떤 옵션을 건드려야 한번 로딩된 이미지는 다시 로딩하지 않을까요?!!

 

 

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .threadPriority(Thread.NORM_PRIORITY - 2)
                .denyCacheImageMultipleSizesInMemory()
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())
                .diskCacheSize(50 * 1024 * 1024) // 50 Mb
                .diskCacheFileCount(100)
                .tasksProcessingOrder(QueueProcessingType.LIFO)
                .build();

        ImageLoader.getInstance().init(config);

 

this.options = new DisplayImageOptions.Builder()
                    .showImageOnLoading(R.drawable.ic_photo_loading_white_24dp)
                    .showImageForEmptyUri(R.drawable.ic_photo_empty_white_24dp)
                    .showImageOnFail(R.drawable.ic_photo_fail_white_24dp)
                    .cacheInMemory(true)
                    .cacheOnDisk(true)
                    .considerExifParams(true)
                    .build();

 

치솟음 (3,710 포인트) 님이 2015년 12월 21일 질문

1개의 답변

0 추천
이건 UIL을 잘못썻다기보다는 adapter의 getView에서 보여줄때 문제가 있을것으로 보여집니다.

셀 생성하는것을 봐야 할것 같네요
캬옹이 (37,920 포인트) 님이 2015년 12월 22일 답변
우선.. 구글링 해서 예제 코드 보고 만들었어요..
뷰홀더?를 사용하는거 같더라고요.
완벽히 이해하지 못한 상태에서 작성하긴 했습니다. 흑 ㅠ

static class ViewHolder{
        ImageView imageView;
    }

    public class GalleryAdapter extends BaseAdapter{

        Context mContext;
        Cursor mCursor;
        String mPrefixPath;
        String mThumbPaths[];
        String mSortOrder;
        DisplayImageOptions options;

        GalleryAdapter(Context context){
            this.options = ((TripColorApp)getApplicationContext()).getDisplayImageOptions();
            this.mContext = context;
            this.mPrefixPath = "file:///";
            this.mSortOrder = MediaStore.Images.Media.DATE_MODIFIED + " DESC";

            ContentResolver cr = getContentResolver();
            mCursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, mSortOrder);
            int imageCount = mCursor.getCount();
            mThumbPaths = new String[imageCount];

            mCursor.moveToFirst();
            //지역코드 조회
            while(!mCursor.isAfterLast()){
                int index = mCursor.getPosition();
                mThumbPaths[index] = mPrefixPath + mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Thumbnails.DATA));
               
                mCursor.moveToNext();
            }
            mCursor.close();

        }

        @Override
        public int getCount() {
            return mThumbPaths.length;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;
            final ViewHolder gridViewHolder;

            if(convertView == null){
                view = getLayoutInflater().inflate(R.layout.gallery_thumbnail, parent, false);
                gridViewHolder = new ViewHolder();
                gridViewHolder.imageView = (ImageView) view.findViewById(R.id.thumbnail_image);
                gridViewHolder.imageView.setMaxWidth(80);
                gridViewHolder.imageView.setMaxHeight(80);
                view.setTag(gridViewHolder);
            }else{
                gridViewHolder = (ViewHolder) view.getTag();
            }

            //UIL 라이브러리 사용
            ImageLoader.getInstance().displayImage(mThumbPaths[position], gridViewHolder.imageView, options, new ImageLoadingListener() {
                @Override
                public void onLoadingStarted(String s, View view) {
                    ((ImageView)view).setScaleType(ImageView.ScaleType.CENTER);
                }

                @Override
                public void onLoadingFailed(String s, View view, FailReason failReason) {
                    ((ImageView)view).setScaleType(ImageView.ScaleType.CENTER);
                }

                @Override
                public void onLoadingComplete(String s, View view, Bitmap bitmap) {
                    ((ImageView)view).setScaleType(ImageView.ScaleType.CENTER_CROP);
                }

                @Override
                public void onLoadingCancelled(String s, View view) {
                    ((ImageView)view).setScaleType(ImageView.ScaleType.CENTER);
                }
            });

            return view;
        }
    }
...