Volley网络框架 compile 'com.android.volley:volley:1.0.0' 1. 创建一个RequestQueue(请求队列)对象。 2. 创建一个StringRequest(字符串请求)对象。
3. 将StringRequest对象添加到RequestQueue里面。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private StringRequest stringRequest;//请求
private RequestQueue mQueue;//请求队列
private ImageView image;//图片控件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mQueue = Volley.newRequestQueue(this);//创建请求队列
initView();
}
private void initStringRequest() {
//创建字符串请求
stringRequest = new StringRequest(
GET,//默认也是GET请求
url,
new Response.Listener() {
@Override//返回结果,调用该方法
public void onResponse(String response) {
}
},
new Response.ErrorListener() {
@Override//返回错位
public void onErrorResponse(VolleyError error) {
}
}
);
mQueue.add(stringRequest);
}
POST请求:
private int page = 0;//点击按钮,会加加,改变请求的参数值
private void initPost() {//POST请求
String url = "http://www.tngou.net/api/lore/list";
StringRequest sr = new StringRequest(
POST, url,
new Response.Listener() {
@Override
public void onResponse(String response) {
System.out.println("---------" + response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
) {
@Override//重写提交POST参数的方法
protected Map getParams() throws AuthFailureError {
Map map = new HashMap<>();
map.put("page", page + "");//往集合里面添加POST请求的参数
String rows = page * 5 + "";
map.put("rows", rows);
return map;//返回集合
}
};
sr.setShouldCache(false);//清除缓存,可用多次请求(默认为true,不会去二次加载)
mQueue.add(sr);
}
请求JSON数据:
private void initJSON() {//请求JSON数据
String url = "http://www.tngou.net/api/lore/list";
JSONObject jsonObject = new JSONObject();
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
url,
null,//可以设置为null(jsonObject)
new Response.Listener() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray array = response.getJSONArray("tngou");
Log.i("MainActivity", "-------JSONArray的长度为:" + array.length());
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
Log.i("MainActivity", "==================JSONObject:" + object.optString("description"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
mQueue.add(jsonObjectRequest);
}
使用ImageRequest加载网络图片
private void initImage() {//加载网络图片
String url = "http://img1.imgtn.bdimg.com/it/u=771033366,2819455885&fm=21&gp=0.jpg";
ImageRequest imageRequest = new ImageRequest(
url,//URL
new Response.Listener() {
@Override
public void onResponse(Bitmap response) {
image.setImageBitmap(response);
}
},
0,//高宽的最大值(设置为0,表示不会进行压缩)
0,
//ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小
Bitmap.Config.RGB_565,//RGB_565则表示每个图片像素占据2个字节大小
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
mQueue.add(imageRequest);
}
使用ImageLoader加载网络图片
如果你觉得ImageRequest已经非常好用了,那我只能说你太容易满足了 ^_^。 实际上,Volley在请求网络图片方面可以做到的还远远不止这些,而ImageLoader就是一个很好的例子。 ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的, 不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存, 还可以过滤掉重复的链接,避免重复发送请求。
String url = "http://img1.imgtn.bdimg.com/it/u=771033366,2819455885&fm=21&gp=0.jpg";
ImageLoader imageLoader = new ImageLoader(
mQueue,
new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
}
);
ImageLoader.ImageListener listener = ImageLoader.getImageListener(
image,//图片控件
R.mipmap.ic_launcher,//加载图片时显示的图片
R.mipmap.ic_launcher);//加载失败时显示的图片
//get()方法接收两个参数,第一个参数就是图片的URL地址,
// 第二个参数则是刚刚获取到的ImageListener对象。
// 当然,如果你想对图片的大小进行限制,也可以使用get()方法的重载,
// 指定图片允许的最大宽度和高度,如下所示:
imageLoader.get(url, listener);
虽然现在我们已经掌握了ImageLoader的用法, 但是刚才介绍的ImageLoader的优点却还没有使用到。 为什么呢?因为这里创建的ImageCache对象是一个空的实现, 完全没能起到图片缓存的作用。其实写一个ImageCache也非常简单, 但是如果想要写一个性能非常好的ImageCache, 最好就要借助Android提供的LruCache功能*/
String url = "http://img1.imgtn.bdimg.com/it/u=771033366,2819455885&fm=21&gp=0.jpg";
ImageLoader imageLoader=new ImageLoader(mQueue,new BitmapCache());
ImageLoader.ImageListener listener=ImageLoader.getImageListener(
image,
R.mipmap.ic_launcher,
R.mipmap.ic_launcher
);
imageLoader.get(url,listener);
实现
ImageLoader.ImageCache
接口:
class BitmapCache implements ImageLoader.ImageCache{
private LruCachemCache;//安卓类
private BitmapCache(){
int maxSize=10*1024*1024;//将缓存图片的大小设置为10M
mCache=new LruCache(maxSize){
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes()*bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url,bitmap);
}