Android Volley源码分析及扩展
转载请标明出处:
http://www.cnblogs.com/why168888/p/6681232.html本文出自:【Edwin博客园】
Volley
介绍
Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient
Android 4.4以上使用HttpURLConnection底层使用OkHttp实现
Volley自带Request
- StringRequest
- ImageRequest
- JsonObjectRequest
- ClearCacheRequest
对Volley扩展的Request
- XMLRequest
- JsonArrayRequest
- MultipartRequest
- GsonRequest
HttpStack
- HurlStack
- HttpClientStack
- OkApacheClientStack
- OkHttpURLConnectionStack
实现底层HttpURLConnection替换成OkHttp
TrafficStats——流量统计类的范例,获取实时网速
- static long getMobileRxBytes() //获取通过Mobile连接收到的字节总数,不包含WiFi
- static long getMobileRxPackets() //获取Mobile连接收到的数据包总数
- static long getMobileTxPackets() //Mobile发送的总数据包数
- static long getTotalRxBytes() //获取总的接受字节数,包含Mobile和WiFi等
- static long getTotalRxPackets() //总的接受数据包数,包含Mobile和WiFi等
- static long getTotalTxBytes() //总的发送字节数,包含Mobile和WiFi等
- static long getTotalTxPackets() //发送的总数据包数,包含Mobile和WiFi等
- static long getUidRxBytes(int uid) //获取某个网络UID的接受字节数,某一个进程的总接收量
- static long getUidTxBytes(int uid) //获取某个网络UID的发送字节数,某一个进程的总发送量
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);//设置线程优先级为后台,这样当多个线程并发后很多无关紧要的线程分配的CPU时间将会减少,有利于主线程的处理,有以下几种:
- int THREAD_PRIORITY_AUDIO //标准音乐播放使用的线程优先级
- int THREAD_PRIORITY_BACKGROUND //标准后台程序
- int THREAD_PRIORITY_DEFAULT // 默认应用的优先级
- int THREAD_PRIORITY_DISPLAY //标准显示系统优先级,主要是改善UI的刷新
- int THREAD_PRIORITY_FOREGROUND //标准前台线程优先级
- int THREAD_PRIORITY_LESS_FAVORABLE //低于favorable
- int THREAD_PRIORITY_LOWEST //有效的线程最低的优先级
- int THREAD_PRIORITY_MORE_FAVORABLE //高于favorable
- int THREAD_PRIORITY_URGENT_AUDIO //标准较重要音频播放优先级
- int THREAD_PRIORITY_URGENT_DISPLAY //标准较重要显示优先级,对于输入事件同样适用。
参考资料
- https://developer.android.com/training/volley/index.html
- https://android-developers.googleblog.com/2011/09/androids-http-clients.html
示例代码
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.6.0'
compile 'com.squareup.okhttp3:okhttp-apache:3.6.0'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0'
compile 'com.google.code.gson:gson:2.8.0'
/**
* 请求方式一:
* <p>
* volley默认的请求方式
* 2.3以后底层用的是HttpURLConnection
*/
void HttpRequest$1() {
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(initializedRequest());
}
/**
* 请求方式二:
* 底层使用okHttp-apache
*/
void HttpRequest$2() {
OkApacheClient okApacheClient = new OkApacheClient();
OkApacheClientStack clientStack = new OkApacheClientStack(okApacheClient);
RequestQueue queue = Volley.newRequestQueue(this, clientStack);
queue.add(initializedRequest());
}
/**
* 请求方式三:
* 底层使用okHttp-urlConnection
*/
void HttpRequest$3() {
OkHttpURLConnectionStack clientStack = new OkHttpURLConnectionStack();
RequestQueue queue = Volley.newRequestQueue(this, clientStack);
queue.add(initializedRequest());
}
Request initializedRequest() {
return new StringRequest(Request.Method.GET,
"http://www.aybrowser.com/sdk/partners/",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("Edwin", "response = " + response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Edwin", "VolleyError = " + error);
}
});
}
/**
* post请求
* 多类型上传
* 文件+字符
*/
void MultipartRequest$4() {
try {
//构造参数列表
List<Part> partList = new ArrayList<Part>();
partList.add(new StringPart("username", "edwin"));
partList.add(new StringPart("email", "edwin.wu@gmail.com"));
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/ic_launcher.png";
partList.add(new FilePart("ic_launcher", new File(path)));
//获取队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
String url = "http://www.cnblogs.com/";
//生成请求
MultipartRequest profileUpdateRequest = new MultipartRequest(url,
partList.toArray(new Part[partList.size()]),
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("Edwin", "onResponse : " + response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Edwin", "MultipartRequest : " + error.getMessage(), error);
}
}) {
@Override
public String getBodyContentType() {
return super.getBodyContentType();
}
};
requestQueue.add(profileUpdateRequest);
} catch (Exception e) {
e.printStackTrace();
}
}
Android Volley源码分析及扩展的更多相关文章
- Android base-adapter-helper 源码分析与扩展
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/44014941,本文出自:[张鸿洋的博客] 本篇博客是我加入Android 开源项 ...
- Android Volley源码分析
今天来顺手分析一下谷歌的volley http通信框架.首先从github上 下载volley的源码, 然后新建你自己的工程以后 选择import module 然后选择volley. 最后还需要更改 ...
- [Android]Volley源码分析(五)
前面几篇通过源码分析了Volley是怎样进行请求调度及请求是如何被实际执行的,这篇最后来看下请求结果是如何交付给请求者的(一般是Android的UI主线程). 类图:
- [Android]Volley源码分析(三)
上篇看了关于Request的源码,这篇接着来看下RequestQueue的源码. RequestQueue类图:
- [Android]Volley源码分析(二)
上一篇介绍了Volley的使用,主要接触了Request与RequestQueue这两个类,这篇就来了解一下这两个类的具体实现. Request类图:
- [Android]Volley源码分析(四)
上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的. Network部分的类图:
- [Android]Volley源码分析(一)
一. 如何使用Volley? 1. 首先定义一个RequestManager类,用来在Android程序启动时对Volley进行初始化.RequestManager为单例类,因为只有在程序启动时调用, ...
- Volley源码分析(2)----ImageLoader
一:imageLoader 先来看看如何使用imageloader: public void showImg(View view){ ImageView imageView = (ImageView) ...
- Appium Android Bootstrap源码分析之启动运行
通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...
随机推荐
- Linux笔记-Linux的命令初解1
我是一个Linux的初学者,经验肯定没有大牛们那么全面,但是我很想把自己在学习过程中的所有所学和一些自己的感悟写下来. 首先我主要看的书为<鸟哥的私房菜>,这是一本非常棒的书,但是你会发现 ...
- C#通过XML导出Excel
最近IOS项目中有手机生成Excel,让我想起了之前做C#时做的生成Excel的,之前都放在空间日志中,今天把它弄到博客中分享一下
- pygame(一)
昨天,是有在树莓派上面操作pygame的,但是树莓派又上不了网了,很奇怪,我的306wifi显示的是树莓派连接成功,但是就是无法用网络,所以就下载不了图片,坐等HDMI线吧. 现在,看小甲鱼的视频已经 ...
- D3基础--数轴
转载请注明出处! 概述: 与比例尺类似,D3的数轴实际上也使用来定义参数的函数.但与比例尺不同的是,调用数轴函数并不会返回值,而是会生成数轴相关的可见元素.包括:轴线,标签和刻度. 但是要注意数轴函数 ...
- JAVA基础之——序列化和反序列化
1 概念 序列化,将java对象转换成字节序列的过程. 反序列化,将字节序列恢复成java对象的过程. 2 为什么要序列化? 2.1 实现数据持久化,当对象创建后,它就会一直在,但是在程序终止时,这个 ...
- Linux下ipv6配置系列
Linux下ipv6配置系列一:如何配置Linux系统ipv6环境 Linux下ipv6配置系列二:如何为Nginx添加ipv6模块 Linux下ipv6配置系列三:如何为Nginx配置IPv6端口监 ...
- C#学习笔记(基础知识回顾)之值传递和引用传递
一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...
- HTML标签类型
标签分类: 一.块标签:块标签是指本身属性为display:block;的元素. 1.默认占一行可以设置宽高, 2.在不设置宽度的情况下,块级元素的宽度是它父级元素内容的宽度 3.在不设置高度的情况下 ...
- Vue指令的钩子函数使用方法
在Vue 中可以把一系列复杂的操作包装为一个指令. 什么是复杂的操作? 我的理解是:复杂逻辑功能的包装.违背数据驱动的 DOM 操作以及对一些 Hack 手段的掩盖等.我们总是期望以操作数据的形式来实 ...
- [ZJOI2008]杀蚂蚁 Solution
题目太长,不在此显示,见洛谷P2586 http://daniu.luogu.org/problem/show?pid=2586 模拟, 那就模拟呗: 各种WA, 然后好久才A了: 一种被社会报复了的 ...