shimi_tap
shimi_tap

Reputation: 7962

Fast image gallery, Fast bitmap loading

I'm trying to build an image gallery like the android native image gallery. I'm using an CursorAdapter, with a disk cache and Mem cache and i adjust all the images to the minimum size, Also tried the inBitamp option of the BitmapFactory, Nothing seem to make the loading fast and smooth enough like the regular Gallery.

This is the Runnable which mainly does all the loading.

    /**
 * Class to asynchronously perform the loading of the bitmap
 */
public class ImageCalcInSampleRunnable implements Runnable {
    protected ImageLoadingArgs mArgs = null;

    public ImageLoadingArgs getmArgs() {
        return mArgs;
    }


    public ImageCalcInSampleRunnable(ImageLoadingArgs args) {
        mArgs = args;
    }

    Future mMyTask = null;

    long timeCounter = 0;


    public void run() {
        timeCounter = System.currentTimeMillis();

        if (mArgs.position < mFirstVisibleItem - IMAGE_CANCEL_THERSHOLD
                ||
                mArgs.position > mLastVisibleCount + IMAGE_CANCEL_THERSHOLD) {

            if (firstReturn) {

                firstReturn = false;
            }
            return;
        }

        firstReturn = true;
        boolean ismimeTypeImage = true;
        if (mArgs.mMimeTpe != null && mArgs.mMimeTpe.contains("video")) {
            ismimeTypeImage = false;
        }

        if (mDiskCache.containsKey(mArgs.mImageId)) {


            mArgs.mBitmap = mDiskCache.getBitmap(mArgs.mImageId);

            addBitmapToMemoryCache(ContentUris.parseId(mArgs.mUri), mArgs.mBitmap);
            if (mArgs.mBitmap != null)

                if (!ismimeTypeImage)
                    mArgs.isVideo = true;



        } else {


            if (ismimeTypeImage) {
                try {
                    mArgs.mBitmap = MediaStore.Images.Thumbnails.getThumbnail(mContentResolver, Long.parseLong(mArgs.mImageId),
                            MediaStore.Images.Thumbnails.MINI_KIND, null);

                    mArgs.mBitmap = scaleCenterCrop(mArgs.mBitmap, mImageWidth, mImageWidth, false);

                } catch (NumberFormatException e) {
                    e.printStackTrace();
                }

                if (mArgs.mBitmap == null) {
                    mArgs.options = ImageManager.decodeInSampledBitmapFromResourceMulti(mArgs.mData, mArgs.mWidth, mArgs.mheight);
                    if (Utils.hasHoneycomb()) {
                        mDiskCache.addInBitmapOptions(mArgs.options);

                        mArgs.mBitmap = BitmapFactory.decodeFile(mArgs.mData, mArgs.options);
                    }else {
                        mArgs.mBitmap = BitmapFactory.decodeFile(mArgs.mData, mArgs.options);
                    }

                    mArgs.mBitmap = scaleCenterCrop(mArgs.mBitmap, mImageWidth, mImageWidth, false);

                }

                if (mArgs.mBitmap != null) {

                    AddBitmapToDiskCache(mArgs.mImageId, mArgs.mBitmap);

                    if (mDiskCache.containsKey(mArgs.mImageId)) {
                        mArgs.mBitmap = mDiskCache.getBitmap(mArgs.mImageId);
                    }

                        addBitmapToMemoryCache(ContentUris.parseId(mArgs.mUri), mArgs.mBitmap);
                } else {
                    try {
                        mArgs.mBitmap = MediaStore.Video.Thumbnails.getThumbnail(mContentResolver, Long.parseLong(mArgs.mImageId),
                                MediaStore.Video.Thumbnails.MINI_KIND, null);
                        mArgs.mBitmap = scaleCenterCrop(mArgs.mBitmap, mImageWidth, mImageWidth, true);

                    } catch (NumberFormatException e) {
                    }
                    if (mArgs.mBitmap != null) {
                        mArgs.isVideo = true;
                        AddBitmapToDiskCache(mArgs.mImageId, mArgs.mBitmap);
                        if (mDiskCache.containsKey(mArgs.mImageId)) {
                            mArgs.mBitmap = mDiskCache.getBitmap(mArgs.mImageId);
                        }
                        addBitmapToMemoryCache(Long.parseLong(mArgs.mImageId), mArgs.mBitmap);
                    }
                }


            } else {
                try {
                    mArgs.mBitmap = MediaStore.Video.Thumbnails.getThumbnail(mContentResolver, Long.parseLong(mArgs.mImageId),
                            MediaStore.Video.Thumbnails.MINI_KIND, null);
                    mArgs.mBitmap = scaleCenterCrop(mArgs.mBitmap, mImageWidth, mImageWidth, true);

                } catch (NumberFormatException e) {
                }
                if (mArgs.mBitmap != null) {
                    mArgs.isVideo = true;
                    AddBitmapToDiskCache(mArgs.mImageId, mArgs.mBitmap);
                    if (mDiskCache.containsKey(mArgs.mImageId)) {
                        mArgs.mBitmap = mDiskCache.getBitmap(mArgs.mImageId);
                    }
                    addBitmapToMemoryCache(Long.parseLong(mArgs.mImageId), mArgs.mBitmap);
                }
            }
        }



        if (mArgs.position > mFirstVisibleItem - IMAGE_CANCEL_THERSHOLD
                &&
                mArgs.position < mLastVisibleCount + IMAGE_CANCEL_THERSHOLD) {

            mArgs.mHandler.sendMessage(mArgs.mHandler.obtainMessage(1,mArgs));

        }

        Log.d("shimi5", "timecount=" + (System.currentTimeMillis() - timeCounter));
        timeCounter = (System.currentTimeMillis() - timeCounter);
        if (timeCounter < 45) {
            try {
                Thread.sleep(45 - timeCounter);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }


    }

    public void cancel() {

    }

    @Override
    public boolean equals(Object obj) {
        if (obj != null && obj instanceof ImageCalcInSampleRunnable) {
            if (mArgs.mUri != null) {
                return mArgs.mUri.equals(((ImageCalcInSampleRunnable) obj).mArgs);
            }
        }
        return false;
    }

    @Override
    public int hashCode() {
        return mArgs.mUri.hashCode();
    }

}

After this a handler simply does setImageBitmap to the image view. Any help with be very helpful

Thanks.

Upvotes: 0

Views: 303

Answers (1)

shimi_tap
shimi_tap

Reputation: 7962

After a while on this problem i gave up trying to optimize my code for a cleaner and smoother loading of images.

I found this : https://github.com/georgiecasey/android-gallery-library

This is a fork of the Android open source Gallery ICS.

Found allot of insight in this.

Upvotes: 1

Related Questions