版权声明:本文为博主原创文章,遵循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,不然的话,很容易发生内存泄漏。

@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}

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

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

public class LifecycleHandler extends Handler implements FullLifecycleObserver {

    private LifecycleOwner mLifecycleOwner;

    public LifecycleHandler(LifecycleOwner lifecycleOwner) {
mLifecycleOwner = lifecycleOwner;
addObserver();
} public LifecycleHandler(LifecycleOwner lifecycleOwner, Callback callback) {
super(callback);
mLifecycleOwner = lifecycleOwner;
addObserver();
} public LifecycleHandler(LifecycleOwner lifecycleOwner, Looper looper) {
super(looper);
mLifecycleOwner = lifecycleOwner;
addObserver();
} public LifecycleHandler(LifecycleOwner lifecycleOwner, Looper looper, Callback callback) {
super(looper, callback);
mLifecycleOwner = lifecycleOwner;
addObserver();
} private void addObserver() {
if (mLifecycleOwner != null) {
mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAstrong textdapter(mLifecycleOwner, this));
}
} @Override
public void onCreate(LifecycleOwner owner) { } @Override
public void onStart(LifecycleOwner owner) { } @Override
public void onResume(LifecycleOwner owner) { } @Override
public void onPause(LifecycleOwner owner) { } @Override
public void onStop(LifecycleOwner owner) { } @Override
public void onDestroy(LifecycleOwner owner) {
removeCallbacksAndMessages(null);
}
}

我们来看一下这一行代码

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

FullLifecycleObserverAdapter 是什么呢?

FullLifecycleObserverAdapter

public class FullLifecycleObserverAdapter implements LifecycleObserver {

    private final FullLifecycleObserver mObserver;

    private static final String TAG = "FullLifecycleObserverAd";
private final LifecycleOwner mLifecycleOwner; FullLifecycleObserverAdapter(LifecycleOwner lifecycleOwner, FullLifecycleObserver observer) {
mLifecycleOwner = lifecycleOwner;
mObserver = observer;
} @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.i(TAG, "onCreate: ");
mObserver.onCreate(mLifecycleOwner);
} @OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.i(TAG, "onStart: ");
mObserver.onStart(mLifecycleOwner);
} @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.i(TAG, "onResume: ");
mObserver.onResume(mLifecycleOwner);
} @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.i(TAG, "onPause: ");
mObserver.onPause(mLifecycleOwner);
} @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.i(TAG, "onStop: ");
mObserver.onStop(mLifecycleOwner);
} @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.i(TAG, "onDestroy: ");
mObserver.onDestroy(mLifecycleOwner);
} }

FullLifecycleObserver

public interface FullLifecycleObserver extends LifecycleObserver {

    void onCreate(LifecycleOwner owner);

    void onStart(LifecycleOwner owner);

    void onResume(LifecycleOwner owner);

    void onPause(LifecycleOwner owner);

    void onStop(LifecycleOwner owner);

    void onDestroy(LifecycleOwner owner);
}

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

的生命周期。

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

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

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

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

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

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


LifecyclePresenter 的封装

public class LifecyclePresenter implements IPresenter, FullLifecycleObserver {

    private static final String TAG = "BasePresenter";

    private final LifecycleOwner mLifecycleOwner;

    public LifecyclePresenter(LifecycleOwner lifecycleOwner) {
mLifecycleOwner = lifecycleOwner;
mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAdapter(lifecycleOwner, this));
} @Override
public void onCreate(LifecycleOwner owner) {
Log.i(TAG, "onCreate: owner = " + owner);
} @Override
public void onStart(LifecycleOwner owner) {
Log.i(TAG, "onStart: owner = " + owner);
} @Override
public void onResume(LifecycleOwner owner) {
Log.i(TAG, "onResume: owner = " + owner);
} @Override
public void onPause(LifecycleOwner owner) {
Log.i(TAG, "onPause: owner = " + owner);
} @Override
public void onStop(LifecycleOwner owner) {
Log.i(TAG, "onStop: owner = " + owner);
} @Override
public void onDestroy(LifecycleOwner owner) {
Log.i(TAG, "onDestroy: owner = " + owner);
}
}

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. 使用gets函数常见问题

    C语言面试经常会考如下一道题,哪里有错误: #include <stdio.h>    int main()  {     char string[100] = {'\0'};       ...

  2. ServiceFabric极简文档-4.0 开发环境搭建

    1. VS2017安装包启动页,安装Azure.(安装的VS的Tool)2. 下载Service Fabric Web PI,安装Service Fabric(自动安装SDK与Runtime)

  3. QQ Music 音乐插件DFX unable to open skin configration 的解决方法

    设置 C:\Program Files (x86)\Tencent\QQMusic\Plugins\Dfx\dfx_skin.txt  它的权限 允许程序读取执行

  4. Sublime Text 3 实现C语言代码的编译和运行

    Sublime Text 3 是一款优秀的代码编辑软件.界面简洁,轻巧快速,很受大家的欢迎. 最近开始用他来编辑数据结构的C语言代码,这就需要在新建编译系统.具体方法如下: 首先: 接下来是关键的一步 ...

  5. 洛谷P1140 相似基因

    题目:https://www.luogu.org/problemnew/show/P1140 分析: 本题一看就知道是一道动归,其实和字串距离非常的像,只不过多了题目规定的匹配相似度罢了. 匹配的相似 ...

  6. TinycoreLinux的安装使用

    下载 http://www.tinycorelinux.net/7.x/x86_64/release/ distribution_files/ 05-Apr-2016 07:29 - src/ 24- ...

  7. [leetcode] 19. Remove Nth Node From End of List (Medium)

    原题链接 删除单向链表的倒数第n个结点. 思路: 用两个索引一前一后,同时遍历,当后一个索引值为null时,此时前一个索引表示的节点即为要删除的节点. Runtime: 13 ms, faster t ...

  8. 关于tomcat-startup.bat启动失败或者一闪而过问题解决记录

    一.前言 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说 ...

  9. 使用java Apache poi 根据word模板生成word报表

    项目开发过程中,客户提出一堆导出报表的需求,需要导出word格式,页眉还需要加上客户公司的logo,试了几种方案,最后选择了用 Apache poi 加上自定义标签的方式实现. 目前功能还比较简单,一 ...

  10. Unity AR Foundation 和 CoreML: 实现手部的检测和追踪

    0x00 前言 Unity的AR Foundation通过上层抽象,对ARKit和ARCore这些底层接口进行了封装,从而实现了AR项目的跨平台开发能力. 而苹果的CoreML是一个可以用来将机器学习 ...