OkHttps 實(shí)現(xiàn)生命周期綁定(for Android)

2020-04-29 09:36 更新

  由于 OkHttps 并不依賴于 Android,所以它并沒(méi)有提供關(guān)于生命周期綁定的直接實(shí)現(xiàn),但它的一些擴(kuò)展機(jī)制讓我們很容易就可以實(shí)現(xiàn)這個(gè)需求。在開(kāi)始之前,我們首先要理解何為生命周期綁定:

所謂的生命周期綁定:即是讓 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í)例具有生命周期綁定的功能,在ActivityFragment里,它的使用效果如下:

// 在 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()ActivityFragment自帶的方法,而bind()HttpTask的現(xiàn)有方法。在配置好HTTP實(shí)例后,上述代碼發(fā)起的請(qǐng)求便可以感知ActivityFragment的生命周期。

  那HTTP實(shí)例到底該如何配置呢?

第一步:配置預(yù)處理器

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ì)象,它的定義見(jiàn)下一步
                task.bind(new LCObserver(task, (Lifecycle) bound));
            }
            chain.proceed();
        })
        ... // 省略其它配置項(xiàng)
        .build();

第二步:定義生命周期監(jiān)視器

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);
    }


}

第三步:配置全局回調(diào)監(jiān)聽(tīng)

  以上兩步其實(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é),可以直接下載下來(lái)使用,還可以基于它再次擴(kuò)展,比如實(shí)現(xiàn)自動(dòng)添加 TOKEN 的功能,具體可以參考6.5 串行預(yù)處理器(TOKEN問(wèn)題最佳解決方案),再比如擴(kuò)展實(shí)現(xiàn)生命周期與下載事件綁定的功能,都非常簡(jiǎn)單。

如果覺(jué)得 OkHttps 還不錯(cuò),就去點(diǎn)個(gè) Star 吧,項(xiàng)目地址:


官方網(wǎng)站:http://okhttps.ejlchina.com/

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)