Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。
Volley的优势是:特别适合数据量小,通信频繁的网络操作。
Volley的主要特点是:
1.扩展性强。Volley 中大多是基于接口的设计,可配置性强。
2.一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。
3.默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 实现。
4.提供简便的图片加载工具。
HTTP协议状态码表示的意思主要分为五类 ,大体是 :
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1×× 保留
2×× 表示请求成功地接收
3×× 为完成请求客户需进一步细化请求
4×× 客户错误
5×× 服务器错误
Volley中会常常提到response 304,意思是,Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
我会再写一篇博客来总结最近学的关于volley的知识点,这篇博客主要是介绍volley的使用方法。
该代码分别实现了Volley中常用的StringRequest的get/post方法,JsonObject的get/post方法以及对图片的网络加载,包括ImageRequest,ImageLoader和NetworkImageView。
其中ImageRequest需要使用queue的add函数,将request加入其中。
ImageLoader和NetworkImageView则是需要使用ImageLoader,并实现一个类来继承ImageLoader.ImageCache。
完整代码实现:https://github.com/xiammu/VolleyTest
package com.example.simmucheng.volleytest;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.StringRequest;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private ImageView image;
private NetworkImageView networkImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InitView();
// volleyGet_RequestString();
// volleyPost_RequestString();
// volleyGet_JsonObject();
// volleyPost_JsonObject();
// volley_ImageRequest();
// volley_ImageLoader();
volley_NetworkImageView();
// volleyImg();
}
private void volley_NetworkImageView() {
String url="http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
ImageLoader loader=new ImageLoader(MyQueue.getHttpQueues(), new ImageCacheTest());
networkImageView.setDefaultImageResId(R.drawable.ic_launcher);
networkImageView.setErrorImageResId(R.drawable.ic_launcher);
networkImageView.setImageUrl(url,loader);
}
private void InitView() {
image= (ImageView) findViewById(R.id.image);
networkImageView= (NetworkImageView) findViewById(R.id.network_imageview);
}
private void volley_ImageRequest() {
String url="http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
ImageRequest imgrequest=new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
image.setImageBitmap(bitmap);
}
//0,0表示不进行压缩,Config.RGB_565表示每个像素占2个字节,Config.ARGB_8888表示每个像素占4个字节等。
//第三第四个参数(maxWidth,maxHeight)指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值
// ,则会对图片进行压缩,指定为0即表示不管图片多大都不压缩。
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
image.setImageResource(R.drawable.ic_launcher);
}
});
MyQueue.getHttpQueues().add(imgrequest);
}
private void volley_ImageLoader() {
String url="http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
//ImageCacheTest需要实现ImageCache引用,并实现其中的两个方法
//ImageCache是内存缓存对象,也叫L1缓存,L2缓存是磁盘缓存,内存缓存就是将展示过的图片放入内存进行缓存,
// 磁盘缓存就是在没有网络的时候调出来使用
ImageLoader loader=new ImageLoader(MyQueue.getHttpQueues(),new ImageCacheTest());
//三个参数分别为控件的id,默认的图片,发生错误时展示的图片
ImageLoader.ImageListener listener=ImageLoader.getImageListener(image,R.drawable.ic_launcher,R.drawable.ic_launcher);
loader.get(url,listener);
}
private void volleyGet_JsonObject() {
String url="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255";
JsonObjectRequest jsrequest=new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
});
jsrequest.setTag("TestTag");
MyQueue.getHttpQueues().add(jsrequest);
}
private void volleyPost_JsonObject() {
String url="http://apis.juhe.cn/mobile/get?";
Map<String,String>map=new HashMap<>();
map.put("phone","13429667914");
map.put("key", "335adcc4e891ba4e4be6d7534fd54c5d");
JSONObject jsobject=new JSONObject(map);
JsonObjectRequest jsrequest=new JsonObjectRequest(Request.Method.POST, url, jsobject, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
});
jsrequest.setTag("TestTag");//设置tag
MyQueue.getHttpQueues().add(jsrequest);
}
private void volleyPost_RequestString() {
String url1="https://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
StringRequest request=new StringRequest(Request.Method.POST, url1, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String>map=new HashMap<String, String>();
map.put("tel","15850781443");
return map;
}
};
request.setTag("TestTag");
MyQueue.getHttpQueues().add(request);
}
private void volleyImg() {
}
private void volleyGet_RequestString() {
String url="https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";
StringRequest request=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
});
request.setTag("TestTag");
MyQueue.getHttpQueues().add(request);
}
@Override
protected void onStop() {
super.onStop();
MyQueue.getHttpQueues().cancelAll("TestTag");//删除特定的tag的request
}
}