在之前我们讲了很多能够优化 Android 开发项目质量的方案,这些方案更多的是从一些比较专精的方向切入的,阐述的是一些比较重要且独立的优化方案。
本文我们将总结一下在日常开发过程中我们能够使用的一些优化项目的技巧和方案。
一、RecycleView 优化
RecycleView在开发时可以考虑以下优化的方案:
1. 数据处理和视图加载分离
a. 数据的处理逻辑尽可能放在异步处理,onBindViewHolder方法只做数据填充视图的操作。
b. 对ItemView设置监听器,不要对每一个Item都调用addxxListener,可以考虑公用一个xxListener,根据ID的不同来操作,优化了对象的频繁创建带来的资源消耗。
2. 数据加载优化
a. 分页拉去远端数据,并对拉去下来的数据进行缓存,尽可能提升二次加载速度。
b. 对于新增的或者删除数据通过 DiffUtil 进行局部数据的刷新,尽量不进行全局数据刷新。
c. 对于使用库版本在25.1.0及以上的时候使用Prefetch功能。
补充:
a. DiffUtil 推荐博客和项目地址:https://github.com/mcxtzhang/SupportDemos、【Android】RecyclerView的好伴侣:详解DiffUtil
b. Prefetch 推荐博客地址:RecyclerView Prefetch功能探究。
3.布局优化
a. 减少布局层级,简化ItemView。
b. 如果Item高度是固定的话,可以使用RecycleView.setHasFixedSize(true)来避免requestLayout浪费资源。
c. 如果多个RecycleView的Adapter是一样的,比如嵌套的RecycleView中存在一样的Adapter,可以通过设置RecycleView.setRecycleViewPool(pool),来共用一个RecycleViewPool。
二、WebView 优化
1. WebView 加载优化
a. 可以将一些资源文件放在assest目录,然后重写WebViewClient的shouldInterreptRequest方法,进行访问地址拦截,当url地址命中本地配置的url时,使用本地资源替代,否则就使用网络上的资源。
b. WebView 初始化慢,可以在适当的时机初始化好一个WebView待用,如果时机合适也可以在初始化好之后请求数据。
2. WebView 内存泄漏优化
a. 建议直接在代码中创建WebView,即使用new WebView(),并传入Application Context 代替在 XML 里面声明防止 Activity 引用被滥用,能解决90%以上的WebView内存泄漏。使用示例如下:
webview = new WebView(getContext().getApplication()); container.addView(webview);
b. 及时销毁WebView。 示例代码如下:
if(webview != null) { webview.setWebViewClient(null); webview.setWebChromeClient(null); webview.loadDataWithBaseURL(null, "”, "text/html", "utf-8", null); ((ViewGroup) webview.getParent()).removeView(webview); webview.destroy(); webview = null; }
三、Apk 包体积优化
1. 资源优化
a. 使用 Lint 工具扫描工程资源,手动移除无用资源。
b. 在Gradle参数中配置 shrinkResource=true。
c. 优先考虑使用Shape代码、.9图、svg矢量图、VectorDrawable 类来替换传统的图片。
2. 代码优化
a. 启用混淆以移除无用代码。
b. 检查代码逻辑,提高复用率。
3. so库优化
可以考虑只提供主流架构的支持,比如arm,对于mips和x86架构可以考虑不提供支持
android { defaultConfig { ... ndk { abiFilters "armeabi-v7a" } } }