• 安卓性能优化积累


    1、activity的泄露
    (1)、如果你持有一个未使用的 Activity 的引用,其实也就持有了 Activity 的布局,自然也就包含了所有的 View。
    (2)、最棘手的是持有静态引用(很危险)
    Activity 和 Fragment 都有自己的生命周期。
    一旦我们持有了静态引用,Activity 和 Fragment 就不会被垃圾回收器清理掉了。(m_staticActivity = staticFragment.getActivity()

    2、泄漏 Listener
    列如:activity单例

    1. public class LeakActivity extends Activity {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. super.onCreate(savedInstanceState);
    5. NastyManager.getInstance().addListener(this);
    6. }
    7. }

    /如果关闭activity销毁时单例没有解绑,会报错
    正确的做法:单例中移除掉对 Activity 的引用

    1. @Override
    2. public void onDestroy() {
    3. super.onDestroy();
    4. NastyManager.getInstance().removeListener(this);
    5. }

    3、内存泄漏—内部类(内部非静态类是不能脱离所属类而单独存活的)

    在 Activity 里有一个很简短的非静态 Handler。
    /只要它还存活着,那么包含它的 Activity 就会存活着

    1. public class MainActivity extends Activity {
    2. //...
    3. Handler handler;
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. //...
    8. handler = new Handler() {
    9. @Override
    10. public void handleMessage(Message msg) {
    11. }
    12. }
    13. }

    //解决:弱引用
    垃圾回收器在回收的时候,是会忽视掉弱引用的,所以包含它的 Activity 会被正常清理掉。

    ///总结:
    相比非静态内部类,最好使用静态内部类。区别就是静态内部类不依赖所属类

    4、泄露总结:
    •移除掉所有的静态引用。
    •考虑用 EventBus 来解耦 Listener。
    •记着在不需要的时候,解除 Listener 的绑定。
    •尽量用静态内部类。
    •做 Code Review。个人经验:Code Review 能很早的发现内存泄漏。
    •了解你程序的结构。
    •用类似 MAT,Eclipse Analyzer,LeakCanary 这样的工具分析内存。
    •在 Callback 里打印 Log。

    5、实现流畅滑动的技巧
    ///UI 线程只用作 UI 渲染、不做下列的事:
    •载入图片
    •网络请求 ( Volley,也可以试试 Square 的 Retrofit
    •解析 JSON (Jackson 以及 ig-json-parser)
    •读取数据库 (Loader,支持批量更新和载入)

    6、确定你是否在主线程的代码
    Looper.myLooper() == Looper.getMainLooper()

    7、并发 APIs
    /App 快速响应请求
    —-> Service 的方法是在 UI 线程执行的。请考虑使用 IntentService,AsyncTask,Executors,Handler 和 Loopers。
    (1)、IntentService(不用更新UI)
    IntentService 是一个单线程,一次一个任务的工作流
    大型复杂的任务,而且这个任务不需要跟 UI 打交道(执行上传功能)
    (2)、AsyncTask (更新 UI)
    注意:当你旋转手机的时候,Activity 会被关闭,然后重启。不然可能造成内存泄露。
    (3)、Executor Framework
    默认是存在一个由系统管理的线程池,你可以通过 callback,future 来控制和管理。

    8、避免使用废弃的 API

    1. •不要通过反射来调用私有 API。
    2. •不要再 NDK 和 C 语言层调用私有 Native 方法。
    3. •不要轻易调用 Runtime.exec 指令完成进程通讯功能。
    4. •adb shell am 做进程通讯并不好。

    /避免使用:
    用 Toolbar 而非 ActionBar,
    在需要动画的时候用 RecyclerView,因为它专门为动画做过优化。

    9、理解架构:
    学习下 App 组件的生命周期。
    比如什么是 Activity 的 Flag?
    什么是 Fragment?
    什么事 stated fragment?
    什么是 task?
    读读文档,尝试下用回调的 log 搞清楚这些概念。

  • 相关阅读:
    Vue.use()和install的小知识
    缺陷检测1
    C语言 —— 初步入门知识(内存、指针、结构体)
    Java&线程&协程
    Rainbow Brackets的配色修改和使用
    音乐生毕业论文有什么好的选题?
    Java(七)——集合框架---ArrayList集合、LinkedList集合
    【Git】安装和常用命令的使用与讲解及项目搭建和团队开发的出现的问题并且给予解决
    千万不要错过,新媒体运营15个宝藏公众号分享
    BOT模块论文阅读
  • 原文地址:https://blog.csdn.net/G11176593/article/details/127099952