Android lifecycle 实战及使用进阶
版权声明:本文为博主原创文章,遵循CC 4.0
by-sa版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gdutxiaoxu/article/details/90522643
前言
github sample 地址:
ArchiteComponentsSample
Android Architecture Components 的,前面我们已经讲解了 lifecycle, LiveData
的使用及原理,今天,让我们一起赖看看 lifecycle 在项目中的实战。主要讲解两点
- LifecycleHandler 的封装
- 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 实战及使用进阶的更多相关文章
- Android图片缓存之Glide进阶
前言: 前面学习了Glide的简单使用(Android图片缓存之初识Glide),今天来学习一下Glide稍微复杂一点的使用. 图片缓存相关博客地址: Android图片缓存之Bitmap详解 And ...
- Android项目实战--手机卫士开发系列教程
<ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件 保存到相册 2 分钟前 上传 Android项目实战--手机卫士01- ...
- android经典实战项目视频教程下载
注:这是一篇转载的文章,原文具体链接地址找不到了,将原文分享如下,希望能对看到的朋友有所帮助! 最近在学习android应用方面的技术,自己在网上搜集了一些实战项目的资料,感觉挺好的,发布出来跟大伙分 ...
- Xamarin Android开发实战(上册)大学霸内部资料
Xamarin Android开发实战(上册)大学霸内部资料 试读文档下载地址:http://pan.baidu.com/s/1jGEHhhO 密码:vcfm 介绍: 本教程是国内唯一的Xamar ...
- Android Xfermode 实战 实现圆形、圆角图片
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42094215,本文出自:[张鸿洋的博客] 1.概述 其实这篇本来准备Androi ...
- Android SurfaceView实战 带你玩转flabby bird (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
- Android SurfaceView实战 带你玩转flabby bird (上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...
- Android SurfaceView实战 打造抽奖转盘
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41722441 ,本文出自:[张鸿洋的博客] 1.概述 今天给大家带来Surfac ...
- Android项目实战(二十九):酒店预定日期选择
先看需求效果图: 几个需求点: 1.显示当月以及下个月的日历 (可自行拓展更多月份) 2.首次点击选择"开始日期",再次点击选择"结束日期" (1).如果&qu ...
随机推荐
- 2. Django每日一码 之as_view() 源码
2019-7-5 今日源码: as_view() CBV与FBV路由区别 urlpatterns = [ url(r'^publish/$', views.Publishs.as_view()), ...
- 用Supervisor实现进程守护,在异常退出时自动重启
程序启动后,有些是以daemon的形式运行,但在意外退出后,如果不能及时重新启动,会有比较严重的影响. 比如Zimg在图片处理中由于某些图片处理失败,会导致zimg进程挂掉,影响正常的服务提供,并且只 ...
- idea中向pom.xml添加依赖时显示”not found dependency“
总结: 起因:再输入hibernate-core的version时,开始写的是对的,就是 5.0.11.Final(这个也是跟着教程来的),直接就报错了,左等右等没用,也点过maven的reimpor ...
- 打开pycharm,提示invalid Log Path【已解决】
问题:打开pycharm,提示invalid Log Path 解决: 网上其他方法都说重装,这个成本有点高,所以我不去尝试. 因为我下载的是免安装版,所以使用时生成的文件是后来才生成的,所以我尝试 ...
- C#3.0新增功能10 表达式树 06 生成表达式
连载目录 [已更新最新开发文章,点击查看详细] 到目前为止,你所看到的所有表达式树都是由 C# 编译器创建的. 你所要做的是创建一个 lambda 表达式,将其分配给一个类型为 Expressi ...
- Uncaught ReferenceError: xxx is not defined 解决办法
VM11371:1 Uncaught ReferenceError: inputSize is not defined at <anonymous>:1:1 解决办法(根据需求调整) ...
- ThinkPHP 5.0 配置
ThinkPHP 5.0 配置 目录 <!-- 系统默认的配置文件目录就是应用目录(APP_PATH), 也就是默认的application下面,并分为应用配置 (整个应用有效)和模块配置(仅针 ...
- 10G文件如何对里面单词出现排序
10G文件如何对里面单词出现排序的问题(只要文件系统支持,不限大小). 其实这个问题很简单,10G文件是很大,但是出现的字符或单词是很有限的. 单字符只有那么一百多个,单词数量满打满算,以英文单词总数 ...
- XTTS系列之一:U2L迁移解决方案之XTTS的使用
本系列的定位是对XTTS及相关技术进行深入的学习研究.作为本系列的开篇,本着实用性的原则,我先把一次实际生产环境U2L的迁移实战实施方案进行提炼简化,旨在能清楚说明该如何使用XTTS这种解决方案来进行 ...
- LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素
题目 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能 ...