一、关于Volley
volley是2013年谷歌i/o大会推出的网络加载框架,不同于 HttpUrlconnection 和 httpClient,, volley对网络请求的过程进行了很好的封装,volley使得网络请求变的非常简单, 使用volley框架我们也可以非常轻松的进行网络图片的加载以及对图片进行简单的处理。
volley适合进行数据量不大但是通信频繁的网络操作,但对于大数据量的网络操作,如下载文件等,volley的表现是很糟的。清楚了这些 ,我们对volley就有了一个基本的定位。
二、volley的基本使用
(一)首先,添加volley依赖。在学习初期,我们建议从网上下载volley的jar包,然后添加到项目中,这样要修改很多东西,虽然麻烦,但是对理解框架的使用有一定的好处。在熟悉了框架的使用之后,我们可以直接利用gradle快速添加依赖,只需要在gradle文件中添加如下一行代码即可
compile 'com.android.volley:volley:1.0.0'
或者如下图,直接添加依赖
(二)volley的简单使用
volley的使用建议使用单例模式,自定义请求队列,建议在application中初始化请求队列,注意:要在清单文件中配置自定义的application。如下代码:
public class MyApplication extends Application {
private RequestQueue requestQueue;
@Override
public void onCreate() {
super.onCreate();
requestQueue = Volley.newRequestQueue(this);
}
public RequestQueue getRequestQueue() {
return requestQueue;
}
}
StringRequest的用法:
public void btnClick1(View view) {
//1.请求方式
//2.请求地址
//3.请求成功的回调
//4.请求失败的回调
StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://192.168.228.2:8080/test", new Response.Listener() {
@Override
public void onResponse(String response) {
tv.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}) {
//如果是Post请求,通过重写该方法来上传参数
@Override
protected Map getParams() throws AuthFailureError {
Map map = new HashMap<>();
map.put("username", "张三");
map.put("password", "123456");
return map;
}
};
//将请求添加到请求队列中
queue.add(stringRequest);
//给请求添加一个标记
// stringRequest.setTag()
// 取消一个请求
// queue.cancelAll();
}
public void btnClick2(View view) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, "http://www.tngou.net/api/lore/classify", null, new Response.Listener() {
@Override
public void onResponse(JSONObject response) {
StringBuffer sb = new StringBuffer();
try {
JSONArray tngou = response.getJSONArray("tngou");
for (int i = 0; i < tngou.length(); i++) {
sb.append(tngou.getJSONObject(i).getString("name")).append("\n");
}
tv.setText(sb.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(jsonObjectRequest);
}
JsonArrayRequest用法
public void btnClick3(View view) {
JSONArray jsonArray = new JSONArray();
try {
JSONObject jo1 = new JSONObject();
jo1.put("user", "zhangsan");
jo1.put("age", 38);
jsonArray.put(jo1);//[{user:zhangsan,age:38}]
Log.d("google.sang", "btnClick3: " + jsonArray);
} catch (JSONException e) {
e.printStackTrace();
}
JsonArrayRequest request = new JsonArrayRequest(Request.Method.POST, "http://192.168.228.2:8080/test", jsonArray, new Response.Listener() {
@Override
public void onResponse(JSONArray response) {
StringBuffer sb = new StringBuffer();
try {
for (int i = 0; i < response.length(); i++) {
sb.append(response.getJSONObject(i).getString("username")).append("\n");
}
tv.setText(sb.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(request);
}
public void btnClick4(View view) {
ImageRequest imageRequest = new ImageRequest("http://n.sinaimg.cn/sinacn/20170309/4fdd-fychhuq3537627.jpg", new Response.Listener() {
@Override
public void onResponse(Bitmap response) {
iv.setImageBitmap(response);
}
}, 200, 200, ImageView.ScaleType.CENTER_CROP, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("google.sang", "onErrorResponse: " + error);
}
});
queue.add(imageRequest);
}
public void btnClick5(View view) {
//1.构造ImageLoader对象
ImageLoader loader = new ImageLoader(queue, new BitmapCache(this));
//2.构造监听器
ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv, R.mipmap.ic_launcher, R.mipmap.ic_launcher);
//3.加载图片
loader.get("http://n.sinaimg.cn/sinacn/20170309/4fdd-fychhuq3537627.jpg", listener);
}