Android优化
ANR分类及超时时间
- UI:5s
- BroadcastReceiver:10s
- Service:20s
ANR原因
引起ANR的原因主要是在主线程做耗时操作导致时间超出系统规定时间限制,就会报出ANR。系统设置ANR的主要原因是给用户更好的体验,防止App卡在某一点没有反应。
UI线程出现ANR
这个是在UI线程做耗时操作:
- 点击事件中做耗时操作,比如:加载较大数据,查询数据库,请求网络等
- 在View绘制过程中(dispatchDrow或者onDraw方法中)创建对象或者做耗时操作
BroadcastReceiver的onReceive方法中出现ANR
这个是在onReceive方法中做了耗时操作,因此需要创建线程和异步任务,或者启动服务,在服务中启动线程进行处理,避免出现ANR。
Service出现ANR
这个通常很少出现,但是如果在Service的主线程中有耗时操作同样会出现ANR现象,因此,耗时操作可以通过Thread或者AsyncTask来处理,也可以通过线程池进行处理。
优化
内存泄漏
- 动画、IO、SQLite、Cursor等资源未释放
- 错误使用单利:如引用了ApplicationContext
- 错误使用静态变量,隐士的持有Activity
- Handler导致的内存泄漏,隐士的持有Activity
- 线程造成的内存泄漏,Activity结束时没结束线程
- 非静态内部类
- 为移除监听,比如进行view.getViewTreeObserver()
布局优化
- 复用布局
- ViewStub
- Merge
- Include
- 代码优化
- View优化
- 四大组件的优化
网络的优化
- 图片进行分类,比如根据当前网络和手机来使用不同的图片
- 网络优化,连接复用、请求合并、减少请求数据的大小
线程优化
- 使用线程池
图片优化
- 压缩图片
- 试图滚动的时候不加载图片,如ListView和RecyclerView
加载优化
- 懒加载优化:ViewPager+Fragment
- App的启动优化和延迟初始化
- App启动白屏优化
- 注解代替枚举
/**
* 注解
*/
@Retention(RetentionPolicy.SOURCE)
public @interface ViewType {
int TYPE_NORMAL = 111;
int TYPE_SPECIAL = 222;
}
@IntDef({ViewType.TYPE_NORMAL,ViewType.TYPE_SPECIAL})
public @interface XXViewType{}
- lowMemory和onTrimMemory
Glide.cleanMemory() 清理缓存的图片
- 去除重复依赖库
gradlew app:denpendecies
方式1
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
def newModule = ModuleVersionSelector
if (requested.name.startsWith("support-core-utils")) {
newModule.group = 'androidx.legacy'
newModule.name = 'legacy-support-core-utils'
newModule.version = rootProject.ext.depenVersion.xVersion
} else {
newModule.group = 'androidx'
newModule.name = requested.name
newModule.version = rootProject.ext.depenVersion.xVersion
}
details.requested = newModule
}
}
}
方式2
可以通过implementation(){
exclude module:'support-v4'
}
页面优化
- SparseArray替代HashMap
- 瀑布流图片错乱
- Item点击事件优化
- ViewHolder的优化
- 连续上拉加载更多
- 拖拽排序和滑动删除优化
- 暂停和停止加载数据优化
- 异常情况下保存状态
- RecyclerView的优化
- Adapter优化
底部导航栏Fragment显和隐
private void showFragment(int position) {
FragmentTransaction ft = fm.beginTransaction();
hideAllFragment(ft);
switch (position) {
case position :
if (mOtherFragment != null) {
ft.show(mOtherFragment);
} else {
mOtherFragment = new OtherFragment();
ft.add(R.id.frame_layout, mOtherFragment);
}
break;
}
ft.commit();
}
private void hideAllFragment(FragmentTransaction ft) {
if (AllFragment != null) {
ft.hide(AllFragment);
}
}

浙公网安备 33010602011771号