首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速图片库,快速位图加载

快速图片库,快速位图加载
EN

Stack Overflow用户
提问于 2014-05-25 02:28:12
回答 1查看 286关注 0票数 0

我正在尝试建立一个像android原生图片库一样的图片库。我使用的是带有磁盘缓存和内存缓存的CursorAdapter,我将所有的图像调整到最小尺寸,也尝试了BitmapFactory的inBitamp选项,似乎没有什么能像常规的Gallery那样使加载足够快和流畅。

这是Runnable,它主要执行所有的加载。

代码语言:javascript
复制
    /**
 * 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();
    }

}

在此之后,处理程序只需对图像视图执行setImageBitmap。任何帮助都是非常有帮助的

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2014-05-25 22:58:40

在这个问题上过了一段时间后,我放弃了尝试优化我的代码,以便更干净、更流畅地加载图像。

我发现了这个:https://github.com/georgiecasey/android-gallery-library

这是一个分支的Android开源画廊ICS。

我在这里面发现了很多洞察力。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23848351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档