您好,登錄后才能下訂單哦!
網(wǎng)絡(luò)優(yōu)化是所有app開發(fā)中非常重要的一部分,如果將網(wǎng)絡(luò)請(qǐng)求前置就是在點(diǎn)擊跳轉(zhuǎn)activity之前開始網(wǎng)絡(luò)加載那么速度將會(huì)有質(zhì)的提升。也就是網(wǎng)絡(luò)預(yù)先加載框框架。
網(wǎng)絡(luò)預(yù)加載框架,監(jiān)聽式網(wǎng)絡(luò)前置加載框架-Network preload, network preload the framework.- pre-network
pre-network:是基于觀察者模式的網(wǎng)絡(luò)預(yù)先前置加載框架,可以對(duì)大程度優(yōu)化網(wǎng)絡(luò)加載速度;每一個(gè)網(wǎng)絡(luò)請(qǐng)求相當(dāng)于被觀察者,只要訂閱了的觀察者能夠拿到被觀察者的實(shí)例。
添加依賴:
implementation 'com.liyihang:pre-network:1.2.2'
每個(gè)被觀察者網(wǎng)絡(luò)都必須有一個(gè)string 唯一id標(biāo)識(shí)他,觀察者訂閱也是通過(guò)唯一的id來(lái)找到被觀察者然后訂閱。
這里例如一個(gè)被觀察者請(qǐng)求的i的是web_data;
首先創(chuàng)建被觀察者網(wǎng)絡(luò)請(qǐng)求;
代碼如下:
PreNetworkHelper.getInstance()
.removeRequestObservable("web_data") // 首先清楚之前的相同id的被觀察者請(qǐng)求移除,如果不移除相同id請(qǐng)求沒(méi)有辦法添加進(jìn)入。
.addRequestObservable(new PNQuickRequest("web_data", "http://baidu.com/"));// 添加被觀察者,添加后立即執(zhí)行網(wǎng)絡(luò)請(qǐng)求。
PNQuickRequest是被觀察者的一個(gè)簡(jiǎn)單封裝;可以看看代碼:
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網(wǎng)絡(luò)請(qǐng)求地址、parm網(wǎng)絡(luò)請(qǐng)求參數(shù)、header網(wǎng)絡(luò)請(qǐng)求請(qǐng)求頭字段。
如何訂閱請(qǐng)求代碼如下:
PreNetworkHelper.getInstance().addObserver(new PNObserver() {
@Override
public void call(PNRequestObservable observable) {
final String result = observable.getResult();// 獲取網(wǎng)絡(luò)請(qǐng)求內(nèi)容 , 這里發(fā)生在非ui線程中。observable就是被觀察者實(shí)例
runOnUiThread(new Runnable() {
@Override
public void run() {
//... do samething
}
});
}
@Override
public String getId() {
return "web_data";// 唯一id
}
}).removeRequestObservable("web_data");// 請(qǐng)求用完了可以移除 ,如果不移除將會(huì)一直保存在內(nèi)存中,注意: 這個(gè)步驟要到addObserver
基本上公司開發(fā)app都會(huì)自己封裝自己的網(wǎng)絡(luò)請(qǐng)求框架,pre-network 使用網(wǎng)絡(luò)請(qǐng)求是基礎(chǔ)的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();
}
});
那么是用自己公司網(wǎng)絡(luò)請(qǐng)求,首先要?jiǎng)?chuàng)建一個(gè)實(shí)現(xiàn)PNRequestObservable類的請(qǐng)求體,這里一繼承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(); 將原來(lái)網(wǎng)絡(luò)請(qǐng)求處理方法關(guān)閉
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) {
//網(wǎng)絡(luò)完畢后必須調(diào)用
requestPost(null);
}
@Override
public void onResponse(Response response) throws IOException {
String data = response.body().string();
// do samething......
//網(wǎng)絡(luò)完畢后必須調(diào)用
requestPost(data);
}
});
}
}
調(diào)用方法例如:
PreNetworkHelper.getInstance()
.removeAllObservable()// 刪除所有請(qǐng)求
.addRequestObservable(new MyRequestObservable())// 添加請(qǐng)求和執(zhí)行
.addObserver(new PNObserver() { //添加回調(diào)
@Override
public void call(PNRequestObservable observable) {
MyRequestObservable result= (MyRequestObservable) observable;
PNUtils.msg("end:"+result.getResult());
}
@Override
public String getId() {
return "request_id";
}
})
.removeAllObservable();
作者:一航
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。