网络优化是所有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 网络优化预加载框架的更多相关文章

  1. Android之图片加载框架Fresco基本使用(一)

    PS:Fresco这个框架出的有一阵子了,也是现在非常火的一款图片加载框架.听说内部实现的挺牛逼的,虽然自己还没研究原理.不过先学了一下基本的功能,感受了一下这个框架的强大之处.本篇只说一下在xml中 ...

  2. android viewpage预加载和懒加载问题

    1.本人理解懒加载和预加载问题某种情况下可以归结为一类问题,下面我就说一下我遇到的预加载问题和懒加载问题及解决的相应方法: - [1 ] 预加载问题        描述:我用到了三个fragment. ...

  3. android Glide图片加载框架的初探

    一.Glide图片加载框架的简介 谷歌2014年开发者论坛会上介绍的图片加载框架,它让我们在处理不管是网路下载的图片还是本地的图片,减轻了很多工作量, 二.开发步骤: 1.添加链接库 compile ...

  4. Android图片异步加载框架Android-Universal-Image-Loader

    版权声明:本文为博主原创文章,未经博主允许不得转载. Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架.这个框架已经被很多开发者所使用,是最常用的几个 ...

  5. Android自定义图片加载框架

    大神原网址: http://blog.csdn.net/lmj623565791/article/details/41874561  思路: 1. 压缩图片 压缩本地图片: 获得imageview想要 ...

  6. Android HotFix动态加载框架介绍

    HotFix(Deprecated) https://github.com/dodola/HotFix 请关注 RocooFix 我重新写了一个RocooFix框架,解决了Nuwa因为Gradle1. ...

  7. android glide图片加载框架

    项目地址: https://github.com/bumptech/glide Glide作为安卓开发常用的图片加载库,有许多实用而且强大的功能,那么,今天就来总结一番,这次把比较常见的都写出来,但并 ...

  8. Android之图片加载框架Fresco基本使用(二)

    PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,Post ...

  9. Android 三大图片加载框架的对比——ImageLoader,Picasso,Glide

    一.ImageLaoder介绍 << Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹ass ...

随机推荐

  1. Linux时间子系统之二:表示时间的单位和结构【转】

    本文转载自:http://blog.csdn.net/droidphone/article/details/7979295 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] ...

  2. java时间类型转换 JsonValueProcessor

    问题描述: java里面时间类型转换成json数据就成这样了:"createTime":{"date":30,"day":3,"h ...

  3. 最大网络流 EK 算法

    网络流是什么类型的问题,看一道题目你就知道了 点击打开链接 . 默认具备图论的基本知识,网络流概念比较多,先看看书熟悉一下那些概念.比较好!一个寄出的网络最大流.EK算法写的. 这是一幅网络,求S   ...

  4. UVA-11082 Matrix Decompressing(有上下界的最大流)

    题目链接: Matrix Decompressing 题意: 给一个矩阵的每行和每列的和,(给的是前i行或者列的和); 矩阵中每个元素的值在1到20之间,找出这样的一个矩阵: 思路: 把它转化成一个二 ...

  5. I.MX6 Parallel RGB LCD Datasheet描述

    /******************************************************************** * I.MX6 Parallel RGB LCD Datas ...

  6. Darwin Streaming Server 核心代码分析

    基本概念 首先,我针对的代码是Darwin Streaming Server 6.0.3未经任何改动的版本. Darwin Streaming Server从设计模式上看,采用了Reactor的并发服 ...

  7. vue中minxin---小记

    定义全局的方法,例如定义过滤器,在很多地方都会用到,就可以定义在minxin中 demo: 数据格式化 保留指定的小数位数 var mixin={ filters:{ fixedNum:functio ...

  8. 分区时"磁盘上没有足够的空间完成此操作"的解决方法

    在新的预装windows 7的品牌机上,工作人员一般将磁盘分为C.D两个分区.但往往造成C盘有很大一部分的空间没办法分出来,而分出来的部分空间又不能和后面的磁盘合并,甚至出现无法新建简单卷的操作,即点 ...

  9. 4、html的body内标签之input系列

    一.input标签与form表单 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  10. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时5

    课时5 数据驱动的图像分类方式:K最邻近与线性分类器(下) 在参数化方法中,我们要做的是构造一个函数,输入一张图片,对每一类输出一个数值.对任意一张图片,我们会计算出它到底属于哪一类.这些参数有时候也 ...