標籤: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預先載入網路架構