版权声明:本文为博主原创文章,遵循CC 4.0

by-sa
版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/gdutxiaoxu/article/details/90522643

前言

Android lifecycle

使用详解

Android LiveData

使用详解

Android lifecyle

源码解剖

Android livedata

源码解剖

Android lifecycle

实战及使用进阶

github sample 地址:

ArchiteComponentsSample

Android Architecture Components 的,前面我们已经讲解了 lifecycle, LiveData

的使用及原理,今天,让我们一起赖看看 lifecycle 在项目中的实战。主要讲解两点

  1. LifecycleHandler 的封装
  2. MVP 中引入 lifecycle,可以自行监听 activity 生命周期变化

LifecycleHandle 的封装

我们平时在使用 handler 的时候,在 activity onDestroy 的时候,需要手动取 removeMessage 或者

removeCallBack,不然的话,很容易发生内存泄漏。

  1. @Override
  2. protected void onDestroy() {
  3. super.onDestroy();
  4. mHandler.removeCallbacksAndMessages(null);
  5. }

这对我们开发者来说,很明显是一个重复的动作。我们一起通过 lifecycle 来减少这种重复性的动作,让其内部自己释放。

核心原理其实很简单,内部监听 activity 生命周期的变化,在 onDestroy 的时候移除 message 和 callback。

  1. public class LifecycleHandler extends Handler implements FullLifecycleObserver {
  2. private LifecycleOwner mLifecycleOwner;
  3. public LifecycleHandler(LifecycleOwner lifecycleOwner) {
  4. mLifecycleOwner = lifecycleOwner;
  5. addObserver();
  6. }
  7. public LifecycleHandler(LifecycleOwner lifecycleOwner, Callback callback) {
  8. super(callback);
  9. mLifecycleOwner = lifecycleOwner;
  10. addObserver();
  11. }
  12. public LifecycleHandler(LifecycleOwner lifecycleOwner, Looper looper) {
  13. super(looper);
  14. mLifecycleOwner = lifecycleOwner;
  15. addObserver();
  16. }
  17. public LifecycleHandler(LifecycleOwner lifecycleOwner, Looper looper, Callback callback) {
  18. super(looper, callback);
  19. mLifecycleOwner = lifecycleOwner;
  20. addObserver();
  21. }
  22. private void addObserver() {
  23. if (mLifecycleOwner != null) {
  24. mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAstrong textdapter(mLifecycleOwner, this));
  25. }
  26. }
  27. @Override
  28. public void onCreate(LifecycleOwner owner) {
  29. }
  30. @Override
  31. public void onStart(LifecycleOwner owner) {
  32. }
  33. @Override
  34. public void onResume(LifecycleOwner owner) {
  35. }
  36. @Override
  37. public void onPause(LifecycleOwner owner) {
  38. }
  39. @Override
  40. public void onStop(LifecycleOwner owner) {
  41. }
  42. @Override
  43. public void onDestroy(LifecycleOwner owner) {
  44. removeCallbacksAndMessages(null);
  45. }
  46. }

我们来看一下这一行代码

  1. mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAdapter(mLifecycleOwner, this));

FullLifecycleObserverAdapter 是什么呢?

FullLifecycleObserverAdapter

  1. public class FullLifecycleObserverAdapter implements LifecycleObserver {
  2. private final FullLifecycleObserver mObserver;
  3. private static final String TAG = "FullLifecycleObserverAd";
  4. private final LifecycleOwner mLifecycleOwner;
  5. FullLifecycleObserverAdapter(LifecycleOwner lifecycleOwner, FullLifecycleObserver observer) {
  6. mLifecycleOwner = lifecycleOwner;
  7. mObserver = observer;
  8. }
  9. @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
  10. public void onCreate() {
  11. Log.i(TAG, "onCreate: ");
  12. mObserver.onCreate(mLifecycleOwner);
  13. }
  14. @OnLifecycleEvent(Lifecycle.Event.ON_START)
  15. public void onStart() {
  16. Log.i(TAG, "onStart: ");
  17. mObserver.onStart(mLifecycleOwner);
  18. }
  19. @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
  20. public void onResume() {
  21. Log.i(TAG, "onResume: ");
  22. mObserver.onResume(mLifecycleOwner);
  23. }
  24. @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
  25. public void onPause() {
  26. Log.i(TAG, "onPause: ");
  27. mObserver.onPause(mLifecycleOwner);
  28. }
  29. @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
  30. public void onStop() {
  31. Log.i(TAG, "onStop: ");
  32. mObserver.onStop(mLifecycleOwner);
  33. }
  34. @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
  35. public void onDestroy() {
  36. Log.i(TAG, "onDestroy: ");
  37. mObserver.onDestroy(mLifecycleOwner);
  38. }
  39. }

FullLifecycleObserver

  1. public interface FullLifecycleObserver extends LifecycleObserver {
  2. void onCreate(LifecycleOwner owner);
  3. void onStart(LifecycleOwner owner);
  4. void onResume(LifecycleOwner owner);
  5. void onPause(LifecycleOwner owner);
  6. void onStop(LifecycleOwner owner);
  7. void onDestroy(LifecycleOwner owner);
  8. }

FullLifecycleObserver 是我们自己自定义的一个接口,继承 LifecycleObserver,各个方法一一对应 activity

的生命周期。

FullLifecycleObserverAdapter 实现了 LifecycleObserver,使用了 @OnLifecycleEvent 注解,在

activity 生命周期变化的时候会回调相应的方法,我们再在里面回调 observer 的 onCreate, onStart

等方法,这有点类似代理模式。调用关系总结如下:

以后想观察 lifecycle 生命周期变化的话,只需要 mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAdapter(mLifecycleOwner, this)); 这一行代码即可

有人可能会这样问了,为什么要这样设计呢

加 FullLifecycleObserver 这个接口,主要是为了跟 activity 的生命周期一一对应。


LifecyclePresenter 的封装

  1. public class LifecyclePresenter implements IPresenter, FullLifecycleObserver {
  2. private static final String TAG = "BasePresenter";
  3. private final LifecycleOwner mLifecycleOwner;
  4. public LifecyclePresenter(LifecycleOwner lifecycleOwner) {
  5. mLifecycleOwner = lifecycleOwner;
  6. mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAdapter(lifecycleOwner, this));
  7. }
  8. @Override
  9. public void onCreate(LifecycleOwner owner) {
  10. Log.i(TAG, "onCreate: owner = " + owner);
  11. }
  12. @Override
  13. public void onStart(LifecycleOwner owner) {
  14. Log.i(TAG, "onStart: owner = " + owner);
  15. }
  16. @Override
  17. public void onResume(LifecycleOwner owner) {
  18. Log.i(TAG, "onResume: owner = " + owner);
  19. }
  20. @Override
  21. public void onPause(LifecycleOwner owner) {
  22. Log.i(TAG, "onPause: owner = " + owner);
  23. }
  24. @Override
  25. public void onStop(LifecycleOwner owner) {
  26. Log.i(TAG, "onStop: owner = " + owner);
  27. }
  28. @Override
  29. public void onDestroy(LifecycleOwner owner) {
  30. Log.i(TAG, "onDestroy: owner = " + owner);
  31. }
  32. }

Android 技术人,一位不羁的码农。

Android lifecycle 实战及使用进阶的更多相关文章

  1. Android图片缓存之Glide进阶

    前言: 前面学习了Glide的简单使用(Android图片缓存之初识Glide),今天来学习一下Glide稍微复杂一点的使用. 图片缓存相关博客地址: Android图片缓存之Bitmap详解 And ...

  2. Android项目实战--手机卫士开发系列教程

    <ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件  保存到相册 2 分钟前 上传   Android项目实战--手机卫士01- ...

  3. android经典实战项目视频教程下载

    注:这是一篇转载的文章,原文具体链接地址找不到了,将原文分享如下,希望能对看到的朋友有所帮助! 最近在学习android应用方面的技术,自己在网上搜集了一些实战项目的资料,感觉挺好的,发布出来跟大伙分 ...

  4. Xamarin Android开发实战(上册)大学霸内部资料

    Xamarin Android开发实战(上册)大学霸内部资料   试读文档下载地址:http://pan.baidu.com/s/1jGEHhhO 密码:vcfm 介绍: 本教程是国内唯一的Xamar ...

  5. Android Xfermode 实战 实现圆形、圆角图片

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42094215,本文出自:[张鸿洋的博客] 1.概述 其实这篇本来准备Androi ...

  6. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  7. Android SurfaceView实战 带你玩转flabby bird (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...

  8. Android SurfaceView实战 打造抽奖转盘

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41722441 ,本文出自:[张鸿洋的博客] 1.概述 今天给大家带来Surfac ...

  9. Android项目实战(二十九):酒店预定日期选择

    先看需求效果图: 几个需求点: 1.显示当月以及下个月的日历 (可自行拓展更多月份) 2.首次点击选择"开始日期",再次点击选择"结束日期" (1).如果&qu ...

随机推荐

  1. python 的一些小项目

    1.在线教育平台(视频播放) 2.仿微信网页版(语音.视频.文字聊天) 3.高德API + Python 解决租房问题 4.仿知乎 5.Django打造文件分享系统.文件管理.搜索引擎(仿云盘) 6. ...

  2. Django rest framework(1)----认证

    目录 Django组件库之(一) APIView源码 Django restframework   (1)  ----认证 Django rest framework(2)----权限 Django ...

  3. [Poi2012]Festival 题解

    [Poi2012]Festival 时间限制: 1 Sec  内存限制: 64 MB 题目描述 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1. 给出a,b (1 ...

  4. 洛谷 P1970 花匠

    题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体而 ...

  5. Excel催化剂开源第51波-Excel催化剂遍历单元格操作性能保障

    在Excel催化剂推出的这一年多时间里,经常性听到一种声音,大概意思是真正会写代码的人,都不会看上Excel催化剂写出来的功能,自己造一个更舒服贴心,仿佛会一点VBA就可以天下无敌一般,也好像Exce ...

  6. websocket的加密和解密过程

    加密: import struct msg_bytes = "the emperor has not been half-baked in the early days of the col ...

  7. ubuntu16.04服务器上无root权限,配置个人tensorflow环境--cuda9.0+cuDNN7+tensorflow-gpu-1.8

    本人在服务器上已经用Anconda创建好python3.5的环境,这个网上有一大堆教程.接下来是重点. 1. cuda的安装 https://developer.nvidia.com/cuda-dow ...

  8. layer设置maxWidth及maxHeight解决方案

    layer介绍 layer是一款近年来备受青睐的web弹层组件,她具备全方位的解决方案,致力于服务各水平段的开发人员,您的页面会轻松地拥有丰富友好的操作体验.下载及使用访问官方网站. area属性 l ...

  9. cookbook_元编程

    1给函数添加一个包装 问题:给函数加一个外包装层,已添加额外的处理,例如,记录日志,计时统计等 解决方案:可以定义一个装饰器来包装函数 2编写装饰器时如何保存函数的元数据 问题:当一个函数被装饰器装饰 ...

  10. 输出单链表倒数第K个结点值

    #include<iostream>using namespace std;#include<malloc.h>#include<stdio.h>typedef i ...