Android开发中使用Volley库发送HTTP请求的实例教程

Android Volley 是Google开发的一个网络lib,可以让你更加简单并且快速的访问网络数据。Volley库的网络请求都是异步的,你不必担心异步处理问题。
Volley的优点:

请求队列和请求优先级 请求Cache和内存管理 扩展性性强 可以取消请求

下载和编译volley.jar
需要安装git,ant,android sdk
clone代码:

git clone https://android.googlesource.com/platform/frameworks/volley

编译jar:

android update project -p . ant jar

添加volley.jar到你的项目中
不过已经有人将volley的代码放到github上了:
https://github.com/mcxiaoke/android-volley,你可以使用更加简单的方式来使用volley:
Maven
format: jar

<dependency> <groupId>com.mcxiaoke.volley</groupId> <artifactId>library</artifactId> <version>1.0.6</version> </dependency>

Gradle
format: jar

compile 'com.mcxiaoke.volley:library:1.0.6'

Volley工作原理图

创建Volley 单例
使用volley时,必须要创建一个请求队列RequestQueue,使用请求队列的最佳方式就是将它做成一个单例,整个app使用这么一个请求队列。

public class AppController extends Application { public static final String TAG = AppController.class .getSimpleName(); private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static AppController mInstance; @Override public void onCreate() { super.onCreate(); mInstance = this; } public static synchronized AppController getInstance() { return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(getApplicationContext()); } return mRequestQueue; } public ImageLoader getImageLoader() { getRequestQueue(); if (mImageLoader == null) { mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache()); } return this.mImageLoader; } public <T> void addToRequestQueue(Request<T> req, String tag) { // set the default tag if tag is empty req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); getRequestQueue().add(req); } public <T> void addToRequestQueue(Request<T> req) { req.setTag(TAG); getRequestQueue().add(req); } public void cancelPendingRequests(Object tag) { if (mRequestQueue != null) { mRequestQueue.cancelAll(tag); } } }

另外,你还需要一个Cache来存放请求的图片:

public class LruBitmapCache extends LruCache<String, Bitmap> implement ImageCache { public static int getDefaultLruCacheSize() { final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; return cacheSize; } public LruBitmapCache() { this(getDefaultLruCacheSize()); } public LruBitmapCache(int sizeInKiloBytes) { super(sizeInKiloBytes); } @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight() / 1024; } @Override public Bitmap getBitmap(String url) { return get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { put(url, bitmap); } }

别忘记在AndroidManifest.xml文件中添加android.permission.INTERNET权限。

HTTP请求实例

private Context mContext; private RequestQueue mRequestQueue; private StringRequest mStringRequest; // 利用Volley实现Post请求 private void volley_post() { String url = "http://aplesson.com/wap/api/user.php?action=login"; mContext = this; mRequestQueue = Volley.newRequestQueue(mContext); mStringRequest = new StringRequest(Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { System.out.println("请求结果:" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("请求错误:" + error.toString()); } }) { // 携带参数 @Override protected HashMap<String, String> getParams() throws AuthFailureError { HashMap<String, String> hashMap = new HashMap<String, String>(); hashMap.put("un", "852041173"); hashMap.put("pw", "852041173abc"); return hashMap; } // Volley请求类提供了一个 getHeaders()的方法,重载这个方法可以自定义HTTP 的头信息。(也可不实现) public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String, String>(); headers.put("Accept", "application/json"); headers.put("Content-Type", "application/json; charset=UTF-8"); return headers; } }; mRequestQueue.add(mStringRequest); } private JsonObjectRequest mJsonObjectRequest; // 利用Volley实现Json数据请求 private void volley_json() { mContext = this; String url = "http://aplesson.com/data/101010100.html"; // 1 创建RequestQueue对象 mRequestQueue = Volley.newRequestQueue(mContext); // 2 创建JsonObjectRequest对象 mJsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println("请求结果:" + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("请求错误:" + error.toString()); } }); // 3 将JsonObjectRequest添加到RequestQueue mRequestQueue.add(mJsonObjectRequest); } // 利用Volley实现Get请求 private void volley_get() { mContext = this; String url = "http://www.aplesson.com/"; // 1 创建RequestQueue对象 mRequestQueue = Volley.newRequestQueue(mContext); // 2 创建StringRequest对象 mStringRequest = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { System.out.println("请求结果:" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("请求错误:" + error.toString()); } }); // 3 将StringRequest添加到RequestQueue mRequestQueue.add(mStringRequest); }

Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。JsonObjectRequest:返回JSON对象。
JsonArrayRequest:返回JsonArray。
StringRequest:返回String,这样可以自己处理数据,更加灵活。
另外可以继承Request<T>自定义Request。

取消Request
Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,Activity被结束了,此时如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。Volley支持多种request取消方式。
可以针对某些个request做取消操作:

@Override public void onStop() { for (Request <?> req : mRequestQueue) { req.cancel(); } }

取消这个队列里的所有请求:

@Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); mRequestQueue.cancelAll(this); }

可以根据RequestFilter或者Tag来终止某些请求

@Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); mRequestQueue.cancelAll( new RequestFilter() {}); or mRequestQueue.cancelAll(new Object()); }

Volley支持http的GET、POST、PUT、DELETE等方法。

时间: 2024-10-26 03:29:43

Android开发中使用Volley库发送HTTP请求的实例教程的相关文章

Android开发中使用Volley库发送HTTP请求的实例教程_Android

Android Volley 是Google开发的一个网络lib,可以让你更加简单并且快速的访问网络数据.Volley库的网络请求都是异步的,你不必担心异步处理问题. Volley的优点: 请求队列和请求优先级 请求Cache和内存管理 扩展性性强 可以取消请求 下载和编译volley.jar需要安装git,ant,android sdk clone代码: git clone https://android.googlesource.com/platform/frameworks/volley

Android开发中常用的库总结(持续更新)

这篇文章用来收集Android开发中常用的库,都是实际使用过的.持续更新... 原文地址:http://www.cnblogs.com/JohnTsai/p/4162390.html 1.消息提示的小红点 微信,微博消息提示的小红点. 开源库地址:https://github.com/stefanjauker/BadgeView 使用示例: BadgeView badge = new BadgeView(getActivity()); badge.setTargetView(myView); b

httpget请求-安卓开发中,用httpGet发送登陆请求,发送到远程服务器区了,而不是本地服务器?

问题描述 安卓开发中,用httpGet发送登陆请求,发送到远程服务器区了,而不是本地服务器? 用httpGet发送登陆请求,安卓模拟器自动把url 的请求发送到 外网的服务器上,而不是本地网络的服务器,本地系统的 hosts 文件已修改,是因为 安卓模拟器里的hosts文件没修改吗? 如果是这样的话,请问是如何修改的呢? 跪求答案,请各位懂这方面知识的大神帮帮忙. 解决方案 模拟器解析url应该是和本地配置没有关系的,LZ可以试着修改模拟器里的hosts

Android开发中原生生成JSON与解析JSON详解教程

下面分为生成JSON数据和解析JSON数据,所用的包是org.json (1)生成JSON数据方法: 比如要生成一个这样的json文本      {       "phone" : ["12345678", "87654321"],    //数组     "name" : "dream9", // 字符串        "age" : 100, // 数值       "ad

Android开发中双进程守护的尝试与分析实例

最近在做一个Android的项目,其包含一个消息推送的后台服务.由于该服务可能会有重要的信息推送,因此并不希望当APP程序退出.APP程序被一键清理.APP被强制停止等用户操作发生时,这个后台服务也随之被杀死.这个问题也就是所谓的"内存永驻".关于这个问题,网上有很多说法,如调用startforehand函数以提高service的优先级.在service中创建一个不能被删掉的notification(或者产生一个其他的与用户界面交互的UI控件).在service的onDestroy函数

Android开发中的Surface库及用其制作播放器UI的例子_Android

1.Surface1.1. 就如在C语言编程一样,通过一个文件的句柄,就可以操作文件,获取文件的内容. 同样的,通过Surface就可以获取raw buffer其中的内容.原生缓冲区(raw buffer)存储着当前窗口的像素数据. 1.2.事实上,当得到一个Surface对象时,同时会得到一个Canvas(画布)对象.这一点可以通过查看\frameworks\base\core\java\android\view\Surface.java文件可知道Surface类定义了一个Canvas成员变量

Android开发中的Surface库及用其制作播放器UI的例子

1.Surface 1.1. 就如在C语言编程一样,通过一个文件的句柄,就可以操作文件,获取文件的内容. 同样的,通过Surface就可以获取raw buffer其中的内容.原生缓冲区(raw buffer)存储着当前窗口的像素数据. 1.2.事实上,当得到一个Surface对象时,同时会得到一个Canvas(画布)对象.这一点可以通过查看\frameworks\base\core\java\android\view\Surface.java文件可知道Surface类定义了一个Canvas成员变

可视化工具-Android开发一个本地题库,在录入题库信息时,怎么将图片信息导入到sqlite中。

问题描述 Android开发一个本地题库,在录入题库信息时,怎么将图片信息导入到sqlite中. 希望录入数据时通过可视化工具(sqlite expert)或者 excel 导入图片.. 实在是没什么思路....希望大家指点一下. 类似的效果 解决方案 小白不懂,还是要帮顶~~ 解决方案二: 虽然没真实往数据库里面存过图片,但还是不建议直接往数据库里面存图片,建议是把图片保存在网络上,这样,在启动APP或者安装之后,可以进行下载. 下载之后保存到本地,然后将路径存入本地数据库(同时将网络和本地路

Android开发中怎样调用mysql数据库中的数据

问题描述 Android开发中怎样调用mysql数据库中的数据 Android开发中怎样调用mysql数据库中的数据,数据库可以是本地也可以是联网的. 解决方案 Android本地是不能直接调用MySQL的,因为很简单,你的Android手机上面不可能安装MySQL服务的.你只能借助于网络通信, 让手机和电脑通过网络连接起来,这样你想在Android端访问MySQL数据库时,就可以通过一定的方式发送一些网络消息请求, 让电脑端去查询数据库,再通过网络把数据返回给Android端.当然,最简单的网