pre-network android 网络优化预加载框架
网络优化是所有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 网络优化预加载框架的更多相关文章
- Android之图片加载框架Fresco基本使用(一)
PS:Fresco这个框架出的有一阵子了,也是现在非常火的一款图片加载框架.听说内部实现的挺牛逼的,虽然自己还没研究原理.不过先学了一下基本的功能,感受了一下这个框架的强大之处.本篇只说一下在xml中 ...
- android viewpage预加载和懒加载问题
1.本人理解懒加载和预加载问题某种情况下可以归结为一类问题,下面我就说一下我遇到的预加载问题和懒加载问题及解决的相应方法: - [1 ] 预加载问题 描述:我用到了三个fragment. ...
- android Glide图片加载框架的初探
一.Glide图片加载框架的简介 谷歌2014年开发者论坛会上介绍的图片加载框架,它让我们在处理不管是网路下载的图片还是本地的图片,减轻了很多工作量, 二.开发步骤: 1.添加链接库 compile ...
- Android图片异步加载框架Android-Universal-Image-Loader
版权声明:本文为博主原创文章,未经博主允许不得转载. Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架.这个框架已经被很多开发者所使用,是最常用的几个 ...
- Android自定义图片加载框架
大神原网址: http://blog.csdn.net/lmj623565791/article/details/41874561 思路: 1. 压缩图片 压缩本地图片: 获得imageview想要 ...
- Android HotFix动态加载框架介绍
HotFix(Deprecated) https://github.com/dodola/HotFix 请关注 RocooFix 我重新写了一个RocooFix框架,解决了Nuwa因为Gradle1. ...
- android glide图片加载框架
项目地址: https://github.com/bumptech/glide Glide作为安卓开发常用的图片加载库,有许多实用而且强大的功能,那么,今天就来总结一番,这次把比较常见的都写出来,但并 ...
- Android之图片加载框架Fresco基本使用(二)
PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,Post ...
- Android 三大图片加载框架的对比——ImageLoader,Picasso,Glide
一.ImageLaoder介绍 << Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹ass ...
随机推荐
- bzoj4169: Lmc的游戏
终于有道我会的了... int f[2][maxn],g[2][maxn],tot[maxn];//构造叶子编号时希望最大/小result 先手取子树最小/大的编号的排名 tot是子树中叶子个数 如果 ...
- 书写优雅的shell脚本(插曲)- ed编辑器
今天发现了一个灰常好用的unix/linux文本行编辑器:ed,对于进行面向行的文本编辑工作她真是太棒了,比vi操作简单.方便.功能强大.感兴趣的同仁可以尝试一下!
- UVA-10600(次小生成树)
题意: 现在给一个图,问最小生成树和次小生成树的权值和是多少; 思路: 求最小生成树的两种方法,次小生成树是交换最小生成树的其中一条边得到的,现在得到了最小生成树,枚举不在次小生成树中的边,再求一边最 ...
- IOCP编程小结(中)
上一篇主要谈了一些基本理念,本篇将谈谈我个人总结的一些IOCP编程技巧. 网络游戏前端服务器的需求和设计 首先介绍一下这个服务器的技术背景.在分布式网络游戏服务器中,前端连接服务器是一种很常见的设计. ...
- 重新安装VMware10提示"The Msi '' Failed"问题解决方案
想把虚拟机软件升级以下,没想到卸载的时候不干净,再安装的时候总提示让我先卸载旧版本但实际上旧版本已经卸载过了,这里又没法再卸载一次,所以就提示”The MSI '' failed“ 显然,安装程序还是 ...
- HTTP错误code大全
100 - Continue 101 - Switching Protocols Top Success Codes 200 - OK 201 - Created 202 - Accepted 203 ...
- 用文件作为Swap分区
用文件作为Swap分区 1.创建要作为swap分区的文件:增加1GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小).# dd if=/dev/zero ...
- Not enough free disk space on disk '/boot'(转载)
转自:http://m.oschina.net/blog/277224 # 解决 出现此情况是因为你的boot分区是单独分区的,像我只给了100M,以前装ubuntu时没有出现,所以当出现这个提示时, ...
- IntentService使用以及源码分析
一 概述 我们知道,在Android开发中,遇到耗时的任务操作时,都是放到子线程去做,或者放到Service中去做,在Service中开一个子线程来执行耗时操作. 那么,在Service里面我们需要自 ...
- bzoj 3365: [Usaco2004 Feb]Distance Statistics 路程统计【容斥原理+点分治】
统计在一个root下的两个子树,每个子树都和前面的运算一下再加进去对于这种需要排序的运算很麻烦,所以考虑先不去同子树内点对的算出合法点对个数,然后减去每一棵子树内的合法点对(它们实际上是不合法的,相当 ...