pre-network android預先載入網路架構

來源:互聯網
上載者:User

標籤:exception   static   相同   return   基於   baidu   如何   header   關閉   

網路最佳化是所有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預先載入網路架構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.