Volley介绍简介
齐射、迸发
volley是Android平台上的网络通信库
特点:
- 通信更简单、更快
- Get、Post 网络请求及网络图像的高效率异步处理请求
- 排序
- 网络请求的缓存
- 多级别取消请求
- 和Activity生命周期的联动
功能:
- 高效的Get/Post方式的数据请求交互
- 网络图片加载和缓存
- 官方推出、性能稳定和强劲
Volley的使用
- Volley的Get和Post请求方式的使用
- Volley的网络请求队列建立和取消
- Volley与Activity生命周期的联动
- Volley的简单的二次回调封装
Volley的Get和Post请求方式的使用
1、挑选合适的对象
- StringRequest //对返回结果不确定类型(包括后面两种)
- JsonObjectRequest //确定类型
- JsonArrayRequest
2、回调的使用
Volley的网络请求队列建立和取消队列请求
1、建立队列请求
2、取消队列请求
Volley与Activity生命周期的联动
特点:Activity销毁时,同时关闭请求
关键点:
- 设置Tag标签,onStop()方法里执行取消队列请求
Volley的简单的二次回调封装
优势:
- 全局使用一个方式,可控,可自定义需求,灵活方便
使用Get方式请求网络数据:
建立一个全局application类
public class VolleyApplication extends Application
{
private static RequestQueue request;
@Override
public void onCreate()
{
super.onCreate();request=Volley.newRequestQueue(getApplicationContext()); } public static RequestQueue getHttpRequestQueue(){ return request; }
}
在主活动中获取数据并存储在请求队列中
1、使用StringRequest
private void request_Get()
{
String url="http://10.207.116.24:8888/GooglePlayServer/home?index=0";
StringRequest request=new StringRequest(Method.GET, url, new Listener<String>() {
@Override
public void onResponse(String response)
{
Toast.makeText(MainActivity.this, response, 1).show();
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error)
{
Toast.makeText(MainActivity.this, error.toString(), 0).show();
}
});
request.setTag("VolleyGet");//添加到队列中
VolleyApplication.getHttpRequestQueue().add(request);
}
2、使用JsonObjectRequest
private void requestJson_Get()
{
String url="http://10.207.116.24:8888/GooglePlayServer/home?index=0";
JsonObjectRequest objectGet=new JsonObjectRequest(Method.GET,
url, null, new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response)
{
Toast.makeText(MainActivity.this, response.toString(), 1).show();
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error)
{
Toast.makeText(MainActivity.this, error.toString(), 0).show();
}
});
objectGet.setTag("VolleyPost");//添加到队列中
VolleyApplication.getHttpRequestQueue().add(objectGet);
}
使用post方式使用Volley请求网络数据
1、使用StringRequest
private void request_Post()
{
String url="http://10.207.116.24:8888/GooglePlayServer/home?";
StringRequest request=new StringRequest(Method.GET, url, new Listener<String>() {
@Override
public void onResponse(String response)
{
Toast.makeText(MainActivity.this, response, 1).show();
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error)
{
Toast.makeText(MainActivity.this, error.toString(), 0).show();
}
}){
//post方式多出来头信息在这里传进去
@Override
protected Map<String, String> getParams() throws AuthFailureError
{
Map<String ,String> hasMap=new HashMap<String, String>();
hasMap.put("index", "0");
//hasMap.put("","");
return hasMap;
}
};
request.setTag("VolleyPost");//添加到队列中
VolleyApplication.getHttpRequestQueue().add(request);
}
2、使用JsonObjectRequest进行Post方式提交网络请求
private void requestJson_post()
{
String url="http://10.207.116.24:8888/GooglePlayServer/home?";
Map<String ,String> hasMap=new HashMap<String, String>();
hasMap.put("index", "0");
JSONObject object=new JSONObject(hasMap);
JsonObjectRequest objectRequest=new JsonObjectRequest(Method.GET, url, object, new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response)
{
Toast.makeText(MainActivity.this, response.toString(), 1).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error)
{
Toast.makeText(MainActivity.this, error.toString(), 0).show();
}
});
objectRequest.setTag("VolleyPost");//添加到队列中
VolleyApplication.getHttpRequestQueue().add(objectRequest);
}
加载图片缓存功能简单介绍
1、LruCache
2、ImageCache
加载网络图片的监听
ImageLoader 、 ImageRequest 、NetworkImageView、ImageListener
使用ImageRequest加载图片:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=(ImageView) findViewById(R.id.img_volley);
String url="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
ImageRequest request=new ImageRequest(url, new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap arg0)
{
img.setImageBitmap(arg0);
}
}, 0, 0, Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0)
{
img.setImageResource(R.drawable.ic_launcher);
}
});
//存储到队列中
MyApplication.getRequest().add(request);
}
使用ImageLoader获取网络图片
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=(ImageView) findViewById(R.id.img_volley);
String url="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
ImageLoader loader=new ImageLoader(MyApplication.getRequest(), new BitmapCache());
ImageListener listener=ImageLoader.getImageListener(img,
R.drawable.ic_launcher, R.drawable.ic_launcher);//加载默认图片、加载失败图片
loader.get(url, listener);
}
自定义BitmapCache
public class BitmapCache implements ImageCache
{
public LruCache<String ,Bitmap>cache;
private int max=10*1024*1024;
public BitmapCache(){
cache=new LruCache<String, Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value)
{
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String arg0)
{
return cache.get(arg0);
}
@Override
public void putBitmap(String arg0, Bitmap arg1)
{
cache.put(arg0, arg1);
}
}
使用NetworkImageView控件加载网络图片,先实例化
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=(ImageView) findViewById(R.id.img_volley);
netImageView=(NetWorkImageView)findViewById(R.id.network);
String url="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
ImageLoader loader=new ImageLoader(MyApplication.getRequest(), new BitmapCache());
netImageView.setDefaultImageResId(R.drawable.ic_launcher);
netImageView.setErrorImageResId(R.drawable.ic_launcher);
netImageView.setImageUrl(url,loader);
}