全文阅读预计 10 分钟
这可能是你看过的最清晰明了的讲解
主题 👇
场景说明:日常开发中,我们可能会在某个
耗时
的接口、线程
中做些操作,耗时的操作执行完毕后更改界面上某个UI
的展示,但如果此时接口、线程
还在工作但Activity
已经关掉了呢?那么就会造成内存泄漏等问题,回顾内存泄漏的定义:生命周期长的对象持有生命周期短对象的引用就可能会造成内存泄漏
,那么此时我们可能会在Activity
的onDestory
中停止掉这些耗时操作,如果你的程序中很多地方都需要在这种生命周期的地方做操作,越往后就越难以管理,那么Jetpack 的 Lifecycles
就是为了便于我们更好的处理这些情况。
Lifecycles
包含有关Activity、Fragment
生命周期状态的信息,并允许
其他对象观察此状态
- 可以用它来观察组件
Activity、Fragment
的生命周期状态
使用 👇
首先,确定几点
- 如果你使用的是
AppCompatActivity
那么写法就会很简单 - 如果你不是上面这种而是直接用的
Activity
那么稍微就多了些代码
如果你用的是 AppCompatActivity
// 第一步
// 我们先创建一个 Observer
// 对于对观察者模式还没有了解的请先移步到观察者的学习,很简单的
class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connect() {
Log.e("test", "连接正常");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disConnect() {
Log.e("test", "断开连接");
}
}
// 第二步
// 如果你使用的是 AppCompatActivity 那么就会很简单
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 只是比常规多了一行这个
getLifecycle().addObserver(new MyObserver());
}
}
运行一下,你会发现当
SecondActivity
的onResume
执行时MyObserver
的connect
方法也会被执行,disConnect
方法亦是同理
如果你用的是 Activity
// 其实也很简单
// 首先 implements LifecycleOwner
// 然后在想要传递事件的地方通过 markState 传递事件(也就是 markState 传的是 PAUSE 那么 MyObserver 中注解 @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) 的 disConnect 方法就会执行)
public class ThirdActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mLifecycleRegistry = new LifecycleRegistry(this);
// 将 MyObserver 绑定上去
getLifecycle().addObserver(new MyObserver());
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
protected void onResume() {
super.onResume();
mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
Ok,这样就写好了
当然,你也可以稍作改造,使它更加易用,一起来看看吧~
// 只是给 MyObserver 增加了一个接口
class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connect() {
mListener.onRefresh("连接正常");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disConnect() {
mListener.onRefresh("断开连接");
}
private OnRefreshListener mListener;
interface OnRefreshListener{
void onRefresh(String option);
}
void setOnRefreshListener(OnRefreshListener listener){
this.mListener = listener;
}
}
// 只是给 Activity or AppCompatActivity 的 onCreate 绑定观察者的地方做了小修改
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mLifecycleRegistry = new LifecycleRegistry(this);
MyObserver observer = new MyObserver();
observer.setOnRefreshListener(new MyObserver.OnRefreshListener() {
@Override
public void onRefresh(String option) {
if(option.equals("连接正常")){
// do something
} else if(option.equals("断开连接")){
// do something
}
}
});
getLifecycle().addObserver(observer);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
很简单的使用方式就完成了,你可以在 do something
的区域中做任何事
文末 👇
同时
我在这里也向你推荐关于 Android Jetpack
的 LiveData、ViewModel
学习,它们将便于你对于项目的维护,让你减少更多的时间用在诸如内存泄漏、配置更改(屏幕旋转后的数据处理问题)
等常见问题上。
而且,我也推荐你对于 MVVM
框架的学习,有了它,会大幅提高你的日常开发效率。
想尝试一下 LiveData ?请进入此链接学习我对于 LiveData 的快速及通俗讲解。 全文阅读预计 15 分钟。
想尝试一下 ViewModel ?请进入此链接学习我对于 ViewModel 的快速及通俗讲解。 全文阅读预计 10 分钟。
想尝试一下 MVVM 框架 ?请进入此链接学习我对于 MVVM框架 的快速及通俗讲解。 全文阅读预计 10 分钟。
码字不易,还请动动小手左侧栏中点赞 👍,3Q