1. 程式人生 > >pre-network android預加載網絡框架

pre-network android預加載網絡框架

imp 處理 說明 request lob 存在 exc creat 求和

網絡優化是所有app開發中非常重要的一部分,如果將網絡請求前置就是在點擊跳轉activity之前開始網絡加載那麽速度將會有質的提升。也就是網絡預先加載框框架。

網絡預加載框架,監聽式網絡前置加載框架-Network preload, network preload the framework.- pre-network

框架說明

pre-network:是基於觀察者模式的網絡預先前置加載框架,可以對大程度優化網絡加載速度;每一個網絡請求相當於被觀察者,只要訂閱了的觀察者能夠拿到被觀察者的實例。

基本使用方法

添加依賴:

implementation ‘com.liyihang:pre-network:1.2.2‘

每個被觀察者網絡都必須有一個string 唯一id標識他,觀察者訂閱也是通過唯一的id來找到被觀察者然後訂閱。
這裏例如一個被觀察者請求的i的是web_data;

首先創建被觀察者網絡請求;
代碼如下:

PreNetworkHelper.getInstance()
                    .removeRequestObservable("web_data") // 首先清楚之前的相同id的被觀察者請求移除,如果不移除相同id請求沒有辦法添加進入。
                    .addRequestObservable(new PNQuickRequest("web_data", "http://baidu.com/"));// 添加被觀察者,添加後立即執行網絡請求。

PNQuickRequest是被觀察者的一個簡單封裝;可以看看代碼:

package com.prenetwork.liyihang.lib_pre_network;

import java.util.Map;

/**
 * Created by liyihang on 18-1-16.
 */

public class PNQuickRequest extends PNRequestObservable {

    private String id;
    private String url;
    private String parms;
    private Map<String, String> header;

    public PNQuickRequest(String id, String url) {
        this.id = id;
        this.url = url;
        parms=null;
        header=null;
    }

    public PNQuickRequest(String id, String url, String parms) {
        this.id = id;
        this.url = url;
        this.parms = parms;
        header=null;
    }

    public PNQuickRequest(String id, String url, String parms, Map<String, String> header) {
        this.id = id;
        this.url = url;
        this.parms = parms;
        this.header = header;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public Map<String, String> getRequestHeader() {
        return header;
    }

    @Override
    public String getRequestParms() {
        return parms;
    }

    @Override
    public String getRequestUrl() {
        return url;
    }

}

其中id是唯一id、url網絡請求地址、parm網絡請求參數、header網絡請求請求頭字段。

如何訂閱請求代碼如下:

PreNetworkHelper.getInstance().addObserver(new PNObserver() {
            @Override
            public void call(PNRequestObservable observable) {
                final String result = observable.getResult();// 獲取網絡請求內容 , 這裏發生在非ui線程中。observable就是被觀察者實例
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //... do samething
                    }
                });
            }

            @Override
            public String getId() {
                return "web_data";// 唯一id
            }
        }).removeRequestObservable("web_data");// 請求用完了可以移除 ,如果不移除將會一直保存在內存中,註意: 這個步驟要到addObserver 

深入使用

基本上公司開發app都會自己封裝自己的網絡請求框架,pre-network 使用網絡請求是基礎的HttpURLConnection:

        executor.submit(new Runnable() {
            @Override
            public void run() {
                if ("GET".equals(getRequestMethod()))
                    result = PNGetPostUtil.sendGet(getRequestUrl(), getRequestParms(), getRequestHeader());

                if ("POST".equals(getRequestMethod()))
                    result = PNGetPostUtil.sendPost(getRequestUrl(), getRequestParms(), getRequestHeader());

                dataChange();
            }
        });

那麽是用自己公司網絡請求,首先要創建一個實現PNRequestObservable類的請求體,這裏一繼承okhttp為例子:

/**
 * Created by liyihang on 18-1-17.
 */

public class MyRequestObservable extends PNRequestObservable {

    private static final OkHttpClient HTTP_CLIENT=new OkHttpClient();

    @Override
    public String getId() {
        return "request_id";// 唯一id
    }

    @Override
    public Map<String, String> getRequestHeader() {
        return null;
    }

    @Override
    public String getRequestParms() {
        return null;
    }

    @Override
    public String getRequestUrl() {
        return null;
    }

    @Override
    public void handlerRequest() {
//        super.handlerRequest(); 將原來網絡請求處理方法關閉
        Request.Builder builder=new Request.Builder();
        builder.url("https://www.baidu.com/");
        HTTP_CLIENT.newCall(builder.build()).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                //網絡完畢後必須調用
                requestPost(null);
            }

            @Override
            public void onResponse(Response response) throws IOException {
                String data = response.body().string();

                // do samething......

                //網絡完畢後必須調用
                requestPost(data);
            }
        });
    }
}

調用方法例如:

        PreNetworkHelper.getInstance()
                .removeAllObservable()// 刪除所有請求
                .addRequestObservable(new MyRequestObservable())// 添加請求和執行
                .addObserver(new PNObserver() { //添加回調
                    @Override
                    public void call(PNRequestObservable observable) {
                        MyRequestObservable result= (MyRequestObservable) observable;
                        PNUtils.msg("end:"+result.getResult());
                    }

                    @Override
                    public String getId() {
                        return "request_id";
                    }
                })
                .removeAllObservable();

作者:一航

pre-network android預加載網絡框架