转载请标明出处:

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 //标准较重要显示优先级,对于输入事件同样适用。

参考资料

示例代码

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源码分析及扩展的更多相关文章

  1. Android base-adapter-helper 源码分析与扩展

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/44014941,本文出自:[张鸿洋的博客] 本篇博客是我加入Android 开源项 ...

  2. Android Volley源码分析

    今天来顺手分析一下谷歌的volley http通信框架.首先从github上 下载volley的源码, 然后新建你自己的工程以后 选择import module 然后选择volley. 最后还需要更改 ...

  3. [Android]Volley源码分析(五)

    前面几篇通过源码分析了Volley是怎样进行请求调度及请求是如何被实际执行的,这篇最后来看下请求结果是如何交付给请求者的(一般是Android的UI主线程). 类图:

  4. [Android]Volley源码分析(三)

    上篇看了关于Request的源码,这篇接着来看下RequestQueue的源码. RequestQueue类图:

  5. [Android]Volley源码分析(二)

    上一篇介绍了Volley的使用,主要接触了Request与RequestQueue这两个类,这篇就来了解一下这两个类的具体实现. Request类图:

  6. [Android]Volley源码分析(四)

    上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的. Network部分的类图:

  7. [Android]Volley源码分析(一)

    一. 如何使用Volley? 1. 首先定义一个RequestManager类,用来在Android程序启动时对Volley进行初始化.RequestManager为单例类,因为只有在程序启动时调用, ...

  8. Volley源码分析(2)----ImageLoader

    一:imageLoader 先来看看如何使用imageloader: public void showImg(View view){ ImageView imageView = (ImageView) ...

  9. Appium Android Bootstrap源码分析之启动运行

    通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...

随机推荐

  1. ASP.NET Core 集成 WebSocket

    1. 环境 AspNetCore Web 2.0 (MVC) Windows 10 IIS 10 Express/IIS VS 2017 2.如何配置 在已有的或者新创建的 AspNet Core M ...

  2. oracle 如何查看已经创建好的触发器语句-select trigger_body from user_triggers where trigger_name='XXXX';

    使用trigge_body查询, select trigger_body from user_triggers where trigger_name='XXXX'; 如下图: SQL> sele ...

  3. java并发编程(10)Fork/Join

    Fork/Join JAVA7中出现的Fork/Join,类似于分布式文件系统hadoop的mapreduce思想,就是将任务分割,再分割,直到分割到满足条件 为了便于理解:编程逻辑可以借用 递归的思 ...

  4. js中进行金额计算

    js中进行金额计算parseFloat   在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题var price = 10.99;var quantity = 7;var n ...

  5. IntelliJ IDEA 2018.3 安装+永久激活[Windows]

    IntelliJ IDEA 作为一个优秀的Java开发环境,深受许多开发者喜爱,但是它的价格却贵得让人无法接受,这篇文章将介绍永久激活IntelliJ IDEA的方法(使用破解补丁). 系统环境:Wi ...

  6. C++ STL:lower_bound与upper_bound实现

    lower_bound lower_bound(begin, end, target)用来查找一个已排序的序列中[begin, end)第一个大于等于target的元素index.数组A如下: val ...

  7. [转]Shared——回调函数是什么

    本文内容转自知乎 作者:no.body 链接:https://www.zhihu.com/question/19801131/answer/27459821 回调函数(callback)是什么? 什么 ...

  8. drupal7 STMP邮件模块配置

    drupal7.54 STMP  version = "7.x-1.6" 配置:   注意:上面的“用户名”需要和“站点信息”页面的电子邮件地址保持一致,邮件发送才能成功 ---- ...

  9. RocketMQ读书笔记6——可靠性优先的使用场景

    [顺序消息] 顺序消费是指消息的产生顺序和消费顺序相同. 比如订单的生成.付款.发货,这三个消息必须按顺序处理才可以. [顺序消息的分类] 全局顺序消息和部分顺序消息. 上面订单的例子,其实是部分顺序 ...

  10. ViewDragHelper详解(侧滑栏)

    1.Drag拖拽:ViewDrag拖拽视图,拖拽控件:ViewDragHelper拖拽视图助手,拖拽操作类.利用ViewDragHelper类可以实现很多绚丽的效果,比如:拖拽删除,拖拽排序,侧滑栏等 ...