網絡優化是全部app開發中很是重要的一部分,若是將網絡請求前置就是在點擊跳轉activity以前開始網絡加載那麼速度將會有質的提高。也就是網絡預先加載框框架。java
網絡預加載框架,監聽式網絡前置加載框架-Network preload, network preload the framework.- pre-networkweb
pre-network:是基於觀察者模式的網絡預先前置加載框架,能夠對大程度優化網絡加載速度;每個網絡請求至關於被觀察者,只要訂閱了的觀察者可以拿到被觀察者的實例。網絡
添加依賴:app
implementation 'com.liyihang:pre-network:1.2.2'
每一個被觀察者網絡都必須有一個string 惟一id標識他,觀察者訂閱也是經過惟一的id來找到被觀察者而後訂閱。
這裏例如一個被觀察者請求的i的是web_data;框架
首先建立被觀察者網絡請求;
代碼以下:ide
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網絡請求請求頭字段。ui
如何訂閱請求代碼以下:this
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:url
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();
做者:一航