code小生,一个专注 Android 领域的技术平台
公众号回复 Android 加入我的安卓技术群
作者:xcheng_链接:https://www.jianshu.com/p/07fe489a53f2声明:本文已获
xcheng_
投稿发表,转发等请联系原作者授权
http请求一直是开发中无法避免的存在,生命周期的管理也一直是开发者的痛点,稍不注意就在回调是抛出异常,如NullPointerException,showDialog导致的WindowLeaked等。
Google 最新推荐的 Lifecycle 架构就是可以让你自己的类拥有像 activity 或 fragment 一样生命周期的功能。
于是我决定采用lifecycle结合retrofit 将http请求和Activity或Fragment的生命周期相结合
本文将从以下几个方面一步步实现功能
多线程分发Lifecycle. Event
retrofit如何与其关联?自定义 CallAdapter.Factory
异步请求如何关联
同步请求如何关联
如果有不熟悉lifecycle的可以自行学习,这里不做介绍了
lifecycle官方文档地址:
https://developer.android.com/topic/libraries/architecture/lifecycle
为什么要使用lifecycle?
activity 和fragment 是有声明周期的,有时候,我们的很多操作需要写在声明周期的方法中,比如,下载,文件操作等,这样很多情况下回导致,我们在activity中的声明周期方法中写越来越多的代码,activity或者fragment 越来越臃肿,代码维护越来越困难。使用lifecycle就可以很好的解决这类问题。
一 、分发lifecycle event
对于event的分发我们采用观察者模式,需要支持多线程环境,因为http请求可能在任意线程中发起。
首先定义一个 LifecycleProvider
类,如下
/**
* 统一分发Activity和 Fragment的生命周期时间.
*/
public interface LifecycleProvider {
/**
* Adds an observer to the list. The observer cannot be null and it must not already
* be registered.
*
* @param observer the observer to register
* @throws IllegalArgumentException the observer is null
*/
void observe(Observer observer);
/**
* Removes a previously registered observer. The observer must not be null and it
* must already have been registered.
*
* @param observer the observer to unregister
* @throws IllegalArgumentException the observer is null
*/
void removeObserver(Observer observer);
/**
* A simple callback that can receive from {@link android.arch.lifecycle.Lifecycle}
*/
interface Observer {
/**
* Called when the event is changed.
*
* @param event The new event
*/
void onChanged(@NonNull Lifecycle.Event event);
}
}
实现类 为AndroidLifecycle
继承了LifecycleObserver
接口监听Lifecycle event
public final class AndroidLifecycle implements LifecycleProvider, LifecycleObserver {
private final Object mLock = new Object();
@GuardedBy("mLock")
private final ArrayList<Observer> mObservers = new ArrayList<>();
/**
* 缓存当前的Event事件
*/
@GuardedBy("mLock")
@Nullable
private Lifecycle.Event mEvent;
@MainThread
public static LifecycleProvider createLifecycleProvider(LifecycleOwner owner) {
return new AndroidLifecycle(owner);
}
private AndroidLifecycle(LifecycleOwner owner) {
owner.getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
void onEvent(LifecycleOwner owner, Lifecycle.Event event) {
synchronized (mLock) {
//保证线程的可见性
mEvent = event;
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged(event);
}
}
if (event &#