由于 OkHttps 并不依賴于 Android,所以它并沒有提供關(guān)于生命周期綁定的直接實(shí)現(xiàn),但它的一些擴(kuò)展機(jī)制讓我們很容易就可以實(shí)現(xiàn)這個(gè)需求。在開始之前,我們首先要理解何為生命周期綁定:
所謂的生命周期綁定:即是讓 HTTP 任務(wù)感知其所屬的 Activity 或 Fragment 的生命周期,當(dāng) Activity 或 Fragment 將被銷毀時(shí),框架應(yīng)自動(dòng)的把由它們發(fā)起的但尚未完成的 HTTP 任務(wù)全部取消,以免導(dǎo)致程序出錯(cuò)!
現(xiàn)在我們需要對(duì)HTTP
實(shí)例進(jìn)行配置,配置后的HTTP
實(shí)例具有生命周期綁定的功能,在Activity
或Fragment
里,它的使用效果如下:
// 在 Activity 或 Fragment 內(nèi)發(fā)起請(qǐng)求
http.async("http://www.baidu.com")
.bind(getLifecycle()) // 綁定生命周期
.setOnResponse((HttpResult result) -> {
Log.i("FirstFragment", "收到請(qǐng)求:" + result.toString());
})
.get();
上述代碼中的getLifecycle()
是Activity
或Fragment
自帶的方法,而bind()
是HttpTask
的現(xiàn)有方法。在配置好HTTP
實(shí)例后,上述代碼發(fā)起的請(qǐng)求便可以感知Activity
或Fragment
的生命周期。
那HTTP
實(shí)例到底該如何配置呢?
HTTP http = HTTP.builder()
... // 省略其它配置項(xiàng)
.addPreprocessor((Preprocessor.PreChain chain) -> {
HttpTask<?> task = chain.getTask();
Object bound = task.getBound();
// 判斷 task 是否綁定了 Lifecycle 對(duì)象
if (bound instanceof Lifecycle) {
// 重新綁定一個(gè) 生命周期監(jiān)視器(LCObserver)對(duì)象,它的定義見下一步
task.bind(new LCObserver(task, (Lifecycle) bound));
}
chain.proceed();
})
... // 省略其它配置項(xiàng)
.build();
public class LCObserver implements LifecycleObserver {
HttpTask<?> task;
Lifecycle lifecycle;
LCObserver(HttpTask<?> task, Lifecycle lifecycle) {
this.task = task;
this.lifecycle = lifecycle;
lifecycle.addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
task.cancel(); // 在 ON_STOP 事件中,取消對(duì)應(yīng)的 HTTP 任務(wù)
}
public void unbind() {
// 在請(qǐng)求完成之后移除監(jiān)視器
lifecycle.removeObserver(this);
}
}
以上兩步其實(shí)已經(jīng)實(shí)現(xiàn)了生命周期綁定的功能,但是在請(qǐng)求完成之后,我們需要在lifecycle
中移除LCObserver
對(duì)象:
HTTP http = HTTP.builder()
... // 省略其它配置項(xiàng)
.completeListener((HttpTask<?> task, HttpResult.State state) -> {
Object bound = task.getBound();
// 判斷 task 是否綁定了生命周期監(jiān)視器(LCObserver)對(duì)象
if (bound instanceof LCObserver) {
// 解綁監(jiān)視器
((LCObserver) bound).unbind();
}
return true;
})
... // 省略其它配置項(xiàng)
.build();
以上三步便在Android中實(shí)現(xiàn)了生命周期與HTTP請(qǐng)求綁定的功能
非常簡(jiǎn)單,懶得敲代碼的同學(xué)還可以 點(diǎn)這里 OkHttps.java 直接下載封裝好的源碼,其中不僅編寫了生命周期綁定的配置,還有在UI線程執(zhí)行回調(diào)的配置。
有需要的同學(xué),可以直接下載下來使用,還可以基于它再次擴(kuò)展,比如實(shí)現(xiàn)自動(dòng)添加 TOKEN 的功能,具體可以參考6.5 串行預(yù)處理器(TOKEN問題最佳解決方案),再比如擴(kuò)展實(shí)現(xiàn)生命周期與下載事件綁定的功能,都非常簡(jiǎn)單。
如果覺得 OkHttps 還不錯(cuò),就去點(diǎn)個(gè) Star 吧,項(xiàng)目地址:
更多建議: