很久没有更新了,从今天开始来一系列关于Android 原生Gallery3d的学习,优化及问题解决的记录。

当有很多Album存在的时候,快速滑动,会发现需要很久才能显示数据,这是因为在
AlbumSetDataLoader里面的ReloadTask加载数据的时候都是从(mContentStart, mContentEnd)在这个范围内开始加载,而不是优先加载可见的范围(mActiveStart,mActiveEnd)而Google的大神在写这个代码的时候就已经意识到了这点,但没有完成,留下了TODO
// TODO: load active range first

所以找到了问题点,我们就优化先加载[mActiveStart,mActiveEnd]再加载(mContentStart,mActiveStart)和(mActiveEnd,mActiveEnd)

 private int getInvalidIndex(long version) {            long setVersion[] = mSetVersion;            int length = setVersion.length;

            //load active range first            for (int i = mActiveStart, n = mActiveEnd; i < n; ++i) {                if (setVersion[i % length] != version){                    return i;                }            }

            //load mContentStart ~ mActiveStart            for (int i = mContentStart; i < mActiveStart; ++i) {                if (setVersion[i % length] != version){                    return i;                }            }

            //load mActiveEnd ~ mContentEnd            for (int i = mActiveEnd; i < mContentEnd; ++i) {                if (setVersion[i % length] != version){                    return i;                }            }            return INDEX_NONE;        }

虽然我们上面修改了这里,但在AlbumSetDataLoader里面的mActiveStart和mActiveEnd是没有正确赋值的,所以我们还需要修改AlbumSettSlidingWindow.java中的

 private void setContentWindow(int contentStart, int contentEnd) {        if (contentStart == mContentStart && contentEnd == mContentEnd){            return;        }

        if (contentStart >= mContentEnd || mContentStart >= contentEnd) {            for (int i = mContentStart, n = mContentEnd; i < n; ++i) {                freeSlotContent(i);            }            mSource.setContentWindow(contentStart, contentEnd);            for (int i = contentStart; i < contentEnd; ++i) {                prepareSlotContent(i);            }        } else {            for (int i = mContentStart; i < contentStart; ++i) {                freeSlotContent(i);            }            for (int i = contentEnd, n = mContentEnd; i < n; ++i) {                freeSlotContent(i);            }            mSource.setContentWindow(contentStart, contentEnd);            for (int i = contentStart, n = mContentStart; i < n; ++i) {                prepareSlotContent(i);            }            for (int i = mContentEnd; i < contentEnd; ++i) {                prepareSlotContent(i);            }        }

        mContentStart = contentStart;        mContentEnd = contentEnd;    }

    public void setActiveWindow(int start, int end) {        if (!(start <= end && end - start <= mData.length && end <= mSize)) {            Utils.fail("start = %s, end = %s, length = %s, size = %s",                    start, end, mData.length, mSize);        }

        AlbumSetEntry data[] = mData;        mActiveStart = start;        mActiveEnd = end;        mSource.setActiveWindow(mActiveStart, mActiveEnd);        int contentStart = Utils.clamp((start + end) / 2 - data.length / 2,                0, Math.max(0, mSize - data.length));        int contentEnd = Math.min(contentStart + data.length, mSize);        setContentWindow(contentStart,contentEnd);

        if (mIsActive) {            updateTextureUploadQueue();            updateAllImageRequests();        }    }

也需要在AlbumSetDataLoader修改如下

 public void setContentWindow(int startContent, int endContent) {        int length = mCoverItem.length;        // If no data is visible, keep the cache content        if (startContent == endContent) {            return;        }

        int contentStart = Utils.clamp((startContent + endContent) / 2 - length / 2,                0, Math.max(0, mSize - length));        int contentEnd = Math.min(contentStart + length, mSize);        if (mContentStart > startContent || mContentEnd < endContent                || Math.abs(contentStart - mContentStart) > MIN_LOAD_COUNT) {            if (contentStart == mContentStart && contentEnd == mContentEnd) {                return;            }

            int start = this.mContentStart;            int end = this.mContentEnd;

            mContentStart = contentStart;            mContentEnd = contentEnd;

            if (contentStart >= end || start >= contentEnd) {                for (int i = start; i < end; ++i) {                    clearSlot(i % length);                }            } else {                for (int i = start; i < contentStart; ++i) {                    clearSlot(i % length);                }                for (int i = contentEnd; i < end; ++i) {                    clearSlot(i % length);                }            }            mReloadTask.notifyDirty();        }

    }

    public void setActiveWindow(int start, int end) {        if (start == mActiveStart && end == mActiveEnd){            return;        }

        Utils.assertTrue(start <= end                && end - start <= mCoverItem.length && end <= mSize);

        mActiveStart = start;        mActiveEnd = end;

    }

dangAlbumDataLoader同意存在这样的问题,但mActiveStart和mActiveEnd是正常被赋值的,所以只需按照AlbumSetDataLoader要修改第一处getInvalidIndex即可。

[color=red]此优化和文章由本人实作,若要转载,请标明出处,谢谢![/color]

Android 原生Gallery3d的优化系列--1相关推荐

  1. Android修行手册-基础优化系列图片篇

    往期文章分享 点击跳转=>GameFramework文档系列(一)- 简介和初步使用 点击跳转=>GameFramework文档系列(二)- 场景相关 点击跳转=>GameFrame ...

  2. Android性能优化系列之apk瘦身

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...

  3. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )

    文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...

  4. 【Android 内存优化】Android 原生 API 图片压缩原理 ( Bitmap_compress 方法解析 | Skia 二维图形库 | libjpeg 函数库 | libpng 函数库 )

    文章目录 一. 图片质量压缩方法 二. Skia 二维图形库 三. libjpeg.libpng 函数库引入 在博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供的 ...

  5. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )

    文章目录 一. 图片质量压缩方法 二. 查找对应的 Native 方法源码 三. 分析 Bitmap.cpp 中动态注册 Native 方法 在博客 [Android 内存优化]图片文件压缩 ( An ...

  6. 【Android 内存优化】Android 原生 API 图片压缩代码示例 ( PNG 格式压缩 | JPEG 格式压缩 | WEBP 格式压缩 | 动态权限申请 | Android10 存储策略 )

    文章目录 一. 图片质量压缩 二. 图片尺寸压缩 三. Android 10 文件访问 四. 完整源码示例 上一篇博客 [Android 内存优化]图片文件压缩 ( Android 原生 API 提供 ...

  7. Android优化系列之apk瘦身

    概述 为什么APK要瘦身.APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中,用户有更多机会选择那个体验最好,功能最多,性能最好 ...

  8. Android 系统性能优化(81)---Android后台优化系列-background optimization-初识低耗电模式

    Android后台优化系列-background optimization-初识低耗电模式 〇. 序 当我们手机屏幕电量的时候,我们或在游戏,或在看视频,或在上网,屏幕是一个很耗电的组件,在电量消耗方 ...

  9. Android编译优化系列-kapt篇

    一.背景 本文是编译优化系列文章之 kapt 优化篇,后续还会有 build cache, kotlin, dex 优化等文章,敬请期待.本文由Client Infra->Build Infra ...

最新文章

  1. HBase 1.1.2 优化插入 Region预分配
  2. html语言 input button,Html-button和input的区别
  3. Jupyter Notebook导入自定义模块
  4. 【直观理解】一文搞懂RNN(循环神经网络)基础篇
  5. [Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]
  6. 页面放在哪_思维制胜!PPT内容巨多的页面,这样排版更高大上
  7. 【Android XMPP】 学习资料收集贴(持续更新)
  8. 荣耀法定代表人由饶俊祥变更为万飚 注册资本增长2973%
  9. 【Elasticsearch】Elasticsearch 最佳实践系列之分片恢复并发故障
  10. Oracle实例之间的心跳机制,为何而心跳-Oracle Heartbeat研究之二
  11. 写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?| 原力计划
  12. vnc服务器拼虚拟机,vnc连接虚拟机,7个步骤vnc连接虚拟机
  13. 常用数据库优化方案(五)
  14. iOS:界面适配(二)--iPhone/iPad适配(关于xib)
  15. 下列选项中非法的c语言转义字符,c语言练习题t答案
  16. 从零开始的立绘拆包教程
  17. 微信小程序:实现微信登录
  18. 乐鑫科技推出基于 ESP32-C3 的 Wi-Fi 单火线智能开关方案
  19. 计算机与网络时间同步,电脑时间同步,教您怎么让电脑时间和网络时间同步
  20. CHERRY 键盘 alt 组合键失灵或开始菜单键失灵

热门文章

  1. android手机时钟、闹钟、计时器、秒表app源码
  2. Capto2022中文版一款适用Mac屏幕录制编辑软件
  3. OptaPlanner将弃用DRL(Drools)评分方式!!!
  4. 苹果用计算机知道密码,苹果电脑钥匙串登录密码忘了怎么办
  5. Java Web之JSP技术
  6. tensor如何实现转置_pytorch tensor 变换
  7. 软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】
  8. fstream ,ifstream,ofstream的用法详解
  9. android 的悬浮窗口,Android 之 悬浮窗口
  10. 最怕你不甘平庸,却又不去行动!