Fork me on GitHub

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);
       }
}
posted @ 2021-06-01 15:29  KevinAt2022  阅读(62)  评论(0)    收藏  举报