转自:https://blog.csdn.net/u011324501/article/details/53933212
如有侵权,告知必删!
Volley可以 自动调度网络请求 多个并发的网络连接 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致 支持请求优先级 支持取消请求的强大API,可以取消单个请求或多个 易于定制 健壮性:便于正确的更新UI和获取数据 包含调试和追踪工具等优点。
Volley特别适合数据量不大但是通信频繁的场景。
1、首先下载一个volley.jar包导入libs文件下,下载地址http://download.csdn.net/detail/u010049692/7813127。
2、新布局代码中添加几个按钮,两个图片按钮和一个textview用于显示数据
-
<?xml version="1.0" encoding="utf-8"?>
-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-
android:id=
"@+id/activity_main"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"match_parent"
-
android:orientation=
"vertical">
-
-
<Button
-
android:id=
"@+id/volley_get"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"wrap_content"
-
android:layout_marginTop=
"5dip"
-
android:text=
"get请求" />
-
-
<Button
-
android:id=
"@+id/volley_post"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"wrap_content"
-
android:layout_marginTop=
"5dip"
-
android:text=
"post请求" />
-
-
<Button
-
android:id=
"@+id/volley_json"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"wrap_content"
-
android:layout_marginTop=
"5dip"
-
android:text=
"请求json数据请求" />
-
-
<Button
-
android:id=
"@+id/volley_imageRequest"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"wrap_content"
-
android:layout_marginTop=
"5dip"
-
android:text=
"imageRequest加载图片" />
-
-
<Button
-
android:id=
"@+id/volley_imageLader"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"wrap_content"
-
android:layout_marginTop=
"5dip"
-
android:text=
"imageLader加载图片" />
-
-
<Button
-
android:id=
"@+id/netWorkImageView"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"wrap_content"
-
android:layout_marginTop=
"5dip"
-
android:text=
"netWorkImageView" />
-
-
<TextView
-
android:layout_width=
"match_parent"
-
android:layout_height=
"wrap_content"
-
android:layout_marginTop=
"5dip"
-
android:text=
"显示结果" />
-
-
<ImageView
-
android:id=
"@+id/volley_image"
-
android:layout_width=
"wrap_content"
-
android:layout_height=
"wrap_content"
-
android:layout_marginTop=
"5dip" />
-
-
<com.facebook.drawee.view.SimpleDraweeView
-
android:id=
"@+id/volley_imageNet"
-
android:layout_width=
"wrap_content"
-
android:layout_height=
"wrap_content"
-
android:layout_marginTop=
"5dip" />
-
-
<ScrollView
-
android:layout_width=
"match_parent"
-
android:layout_height=
"match_parent"
-
android:layout_marginTop=
"5dip">
-
-
<TextView
-
android:id=
"@+id/volley_result"
-
android:layout_width=
"match_parent"
-
android:layout_height=
"wrap_content"
-
android:text=
"" />
-
-
</ScrollView>
-
</LinearLayout>
3、由于要显示网络图片,所以添加fresco,需要在build.gradle 中添加下面代码,并在需要在新建一个MyApplication类,记得在权限中添加。还要添加网络权限代码
compile 'com.facebook.fresco:fresco:0.12.0'
package com.example.apple.volley; import android.app.Application; import com.facebook.drawee.backends.pipeline.Fresco; /** * Created by apple on 16/12/29. */ public class MyApplication extends Application { public MyApplication() { super(); } @Override public void onCreate() { super.onCreate(); //Fresco初始化 Fresco.initialize(getApplicationContext()); } }
-
<?xml version="1.0" encoding="utf-8"?>
-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-
package=
"com.example.apple.volley">
-
<uses-permission android:name="android.permission.INTERNET" />
-
<application
-
android:name=
".MyApplication"
-
android:allowBackup=
"true"
-
android:icon=
"@mipmap/ic_launcher"
-
android:label=
"@string/app_name"
-
android:supportsRtl=
"true"
-
android:theme=
"@style/AppTheme">
-
<activity android:name=".MainActivity">
-
<intent-filter>
-
<action android:name="android.intent.action.MAIN" />
-
-
<category android:name="android.intent.category.LAUNCHER" />
-
</intent-filter>
-
</activity>
-
</application>
-
</manifest>
4、先实现get 请求,首先创建一个队列,然后创建一个请求,将url传进去,请求中有两个方法,当正确接受数据时可以打印出来,错误时也可以显示出来,最后添加到队列中,这就完成了get请求。返回的数据可自己处理。
-
/**
-
* get
-
*/
-
public void get(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
//创建一个请求
-
String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
-
-
StringRequest stringRequest =new StringRequest(url, new Response.Listener
<String>() {
-
//正确接收数据回调
-
@Override
-
public void onResponse(String s) {
-
-
try {
-
JSONObject jsonObject = new JSONObject(s);
-
// TestData testData= new Gson().fromJson(s, TestData.class);
-
// Log.e(TAG,"length="+jsonObject.getJSONObject("trailers").length());
-
// for (int i = 0;i
<jsonObject.getJSONObject("trailers").length();i++){
-
volley_result.setText(s);
-
Log.e(TAG,"s="+jsonObject.getJSONArray("trailers").get(0)+"\n");
-
// }
-
-
} catch (JSONException e) {
-
e.printStackTrace();
-
}
-
-
}
-
}, new Response.ErrorListener() {//异常后的监听数据
-
@Override
-
public void onErrorResponse(VolleyError volleyError) {
-
volley_result.setText("加载错误"+volleyError);
-
}
-
});
-
//将get请求添加到队列中
-
requestQueue.add(stringRequest);
-
}
5、实现post请求,post请求跟get差不多,都要创建一个队列,然后创建一个请求,再添加到队列中,不同的是,需要在创建请求时声明是POST,传入参数时可以用Map,然后返回。
-
private void post(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
//创建一个请求
-
String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
-
-
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener
<String>() {
-
@Override
-
public void onResponse(String s) {
-
volley_result.setText(s);
-
}
-
-
}, new Response.ErrorListener() {
-
@Override
-
public void onErrorResponse(VolleyError volleyError) {
-
volley_result.setText("加载错误"+volleyError);
-
}
-
}){
-
@Override
-
protected Map
<String, String> getParams() throws AuthFailureError {
-
-
Map
<String,String> map = new HashMap
<>();
-
// map.put("value1","param1");//传入参数
-
-
return map;
-
}
-
};
-
-
//将post请求添加到队列中
-
requestQueue.add(stringRequest);
-
}
6、json请求,跟上面基本一样,但是如果数据格式外面时{}需要用JsonObjectRequest,如果时[]则要用JsonArrayRequest,返回的是JSONObject数据。
-
private void json(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
-
//创建一个请求
-
String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
-
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener
<JSONObject>() {
-
@Override
-
public void onResponse(JSONObject jsonObject) {
-
//TestData data = new Gson().fromJson(String.valueOf(jsonObject),TestData.class);
-
volley_result.setText(jsonObject.toString());
-
Log.e(TAG,"data="+jsonObject);
-
}
-
}, new Response.ErrorListener() {
-
@Override
-
public void onErrorResponse(VolleyError volleyError) {
-
volley_result.setText("加载错误"+volleyError);
-
-
}
-
});
-
-
//将创建的请求添加到队列中
-
requestQueue.add(jsonObjectRequest);
-
}
7、加载图片,也是需要那三步,但是是用ImageRequest。
-
/**
-
* 加载图片
-
*/
-
private void image(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
-
//创建一个请求
-
String url = "http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
-
//第二个参数,第三个:宽高,第四个:图片质量
-
ImageRequest imageRequest = new ImageRequest(url, new Response.Listener
<Bitmap>() {
-
@Override
-
public void onResponse(Bitmap bitmap) {
-
//正确接收图片
-
volley_image.setImageBitmap(bitmap);
-
}
-
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
-
@Override
-
public void onErrorResponse(VolleyError volleyError) {
-
volley_image.setImageResource(R.mipmap.ic_launcher);
-
}
-
});
-
-
//将创建的请求添加到队列中
-
requestQueue.add(imageRequest);
-
}
8、加载网络图片,这个可以新建一个BitmapCache类用来缓存图片
private void imageLoader(){ //创建一个请求队列 requestQueue = Volley.newRequestQueue(MainActivity.this); //创建一个请求 // ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() { // @Override // public Bitmap getBitmap(String s) { // return null; // } // // @Override // public void putBitmap(String s, Bitmap bitmap) { // // } // }); ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());//带缓存 //加载图片 String url = "http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg"; //加载不到,加载失败 ImageLoader.ImageListener imageLister = imageLoader.getImageListener(volley_imageNet,R.mipmap.ic_launcher,R.mipmap.ic_launcher); imageLoader.get(url,imageLister); }
-
package com.example.apple.volley.entity;
-
-
import android.graphics.Bitmap;
-
import android.util.LruCache;
-
-
import com.android.volley.toolbox.ImageLoader;
-
-
/**
-
* Created by apple on 16/12/29.
-
* 图片缓存
-
*/
-
-
public class BitmapCache implements ImageLoader.ImageCache{
-
-
private LruCache
<String,Bitmap> mCache;
-
-
public BitmapCache() {
-
int maxSize = 10* 1024 *1024;//10m
-
mCache = new LruCache
<String,Bitmap>(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);
-
}
-
}
10、加载网络图片
11、最后可以在stop中添加取消所有队列
/** * netWorkImageView */ private void netWorkImageView(){ //创建一个请求队列 requestQueue = Volley.newRequestQueue(MainActivity.this); //创建一个imageLoader ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache()); //默认图片设置 volley_imageNet.setImageResource(R.mipmap.ic_launcher); //加载图片 String url = "http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg"; volley_imageNet.setImageURI(url,imageLoader); }
@Override protected void onStop() { super.onStop(); //取消队列里所有的请求 requestQueue.cancelAll(this); }
完整代码:
-
package com.example.apple.volley;
-
-
import android.graphics.Bitmap;
-
import android.support.v7.app.AppCompatActivity;
-
import android.os.Bundle;
-
import android.util.Log;
-
import android.view.View;
-
import android.widget.Button;
-
import android.widget.ImageView;
-
import android.widget.TextView;
-
-
import com.android.volley.AuthFailureError;
-
import com.android.volley.Request;
-
import com.android.volley.RequestQueue;
-
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.StringRequest;
-
import com.android.volley.toolbox.Volley;
-
import com.example.apple.volley.entity.BitmapCache;
-
import com.facebook.drawee.view.SimpleDraweeView;
-
-
import org.json.JSONException;
-
import org.json.JSONObject;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
/
-
* JSON,图像等的异步下载;
-
网络请求的排序(scheduling)
-
网络请求的优先级处理
-
缓存
-
多级别取消请求
-
和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)
-
/
-
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
-
-
private Button volley_get;
-
private Button volley_post;
-
private Button volley_json;
-
private Button volley_imageRequest;
-
private Button volley_imageLader;
-
private Button netWorkImageView;
-
private ImageView volley_image;
-
private SimpleDraweeView volley_imageNet;
-
private TextView volley_result;
-
private final String TAG = "MainActivity";
-
-
RequestQueue requestQueue;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
-
initView();
-
}
-
-
private void initView() {
-
volley_get = (Button)findViewById(R.id.volley_get);
-
volley_get.setOnClickListener(this);
-
-
volley_post = (Button)findViewById(R.id.volley_post);
-
volley_post.setOnClickListener(this);
-
-
volley_json = (Button)findViewById(R.id.volley_json);
-
volley_json.setOnClickListener(this);
-
-
volley_imageRequest = (Button)findViewById(R.id.volley_imageRequest);
-
volley_imageRequest.setOnClickListener(this);
-
-
volley_imageLader = (Button)findViewById(R.id.volley_imageLader);
-
volley_imageLader.setOnClickListener(this);
-
-
netWorkImageView = (Button)findViewById(R.id.netWorkImageView);
-
netWorkImageView.setOnClickListener(this);
-
-
volley_image = (ImageView) findViewById(R.id.volley_image);
-
-
volley_imageNet = (SimpleDraweeView) findViewById(R.id.volley_imageNet);
-
-
volley_result = (TextView)findViewById(R.id.volley_result);
-
}
-
-
@Override
-
public void onClick(View v) {
-
switch (v.getId()){
-
-
case R.id.volley_get://get请求
-
-
get();
-
-
break;
-
-
case R.id.volley_post://post请求
-
-
post();
-
break;
-
-
case R.id.volley_json://json请求 JsonObjectRequest{} JsonArrayRequest[]
-
-
json();
-
break;
-
-
case R.id.volley_imageRequest://imageRequest加载图片
-
-
image();
-
break;
-
-
case R.id.volley_imageLader://imageLader加载图片
-
imageLoader();
-
-
break;
-
-
case R.id.netWorkImageView:
-
netWorkImageView();
-
break;
-
-
default:
-
break;
-
-
}
-
}
-
-
/
-
get
-
/
-
public void get(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
//创建一个请求
-
String url = "
http://api.m.mtime.cn/PageSubArea/TrailerList.api";
-
-
StringRequest stringRequest =new StringRequest(url, new Response.Listener
<String>() {
-
//正确接收数据回调
-
@Override
-
public void onResponse(String s) {
-
-
try {
-
JSONObject jsonObject = new JSONObject(s);
-
// TestData testData= new Gson().fromJson(s, TestData.class);
-
// Log.e(TAG,"length="+jsonObject.getJSONObject("trailers").length());
-
// for (int i = 0;i
<jsonObject.getJSONObject("trailers").length();i++){
-
volley_result.setText(s);
-
Log.e(TAG,"s="+jsonObject.getJSONArray("trailers").get(0)+"\n");
-
// }
-
-
} catch (JSONException e) {
-
e.printStackTrace();
-
}
-
-
}
-
}, new Response.ErrorListener() {//异常后的监听数据
-
@Override
-
public void onErrorResponse(VolleyError volleyError) {
-
volley_result.setText("加载错误"+volleyError);
-
}
-
});
-
//将get请求添加到队列中
-
requestQueue.add(stringRequest);
-
}
-
-
/
-
post
-
/
-
private void post(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
//创建一个请求
-
String url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
-
-
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
-
@Override
-
public void onResponse(String s) {
-
volley_result.setText(s);
-
}
-
-
}, new Response.ErrorListener() {
-
@Override
-
public void onErrorResponse(VolleyError volleyError) {
-
volley_result.setText("加载错误"+volleyError);
-
}
-
}){
-
@Override
-
protected Map
<String, String> getParams() throws AuthFailureError {
-
-
Map
<String,String> map = new HashMap
<>();
-
// map.put("value1","param1");//传入参数
-
-
return map;
-
}
-
};
-
-
//将post请求添加到队列中
-
requestQueue.add(stringRequest);
-
}
-
-
/
-
json
-
/
-
private void json(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
-
//创建一个请求
-
String url = "
http://api.m.mtime.cn/PageSubArea/TrailerList.api";
-
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener
<JSONObject>() {
-
@Override
-
public void onResponse(JSONObject jsonObject) {
-
-
//TestData data = new Gson().fromJson(String.valueOf(jsonObject),TestData.class);
-
-
volley_result.setText(jsonObject.toString());
-
-
-
Log.e(TAG,"data="+jsonObject);
-
}
-
}, new Response.ErrorListener() {
-
@Override
-
public void onErrorResponse(VolleyError volleyError) {
-
volley_result.setText("加载错误"+volleyError);
-
-
}
-
});
-
-
//将创建的请求添加到队列中
-
requestQueue.add(jsonObjectRequest);
-
}
-
-
/
-
加载图片
-
/
-
private void image(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
-
//创建一个请求
-
String url = "
http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
-
//第二个参数,第三个:宽高,第四个:图片质量
-
ImageRequest imageRequest = new ImageRequest(url, new Response.Listener
<Bitmap>() {
-
@Override
-
public void onResponse(Bitmap bitmap) {
-
//正确接收图片
-
volley_image.setImageBitmap(bitmap);
-
}
-
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
-
@Override
-
public void onErrorResponse(VolleyError volleyError) {
-
volley_image.setImageResource(R.mipmap.ic_launcher);
-
}
-
});
-
-
//将创建的请求添加到队列中
-
requestQueue.add(imageRequest);
-
}
-
-
/
-
imageLoader
-
/
-
private void imageLoader(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
-
//创建一个请求
-
-
// ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
-
// @Override
-
// public Bitmap getBitmap(String s) {
-
// return null;
-
// }
-
//
-
// @Override
-
// public void putBitmap(String s, Bitmap bitmap) {
-
//
-
// }
-
// });
-
-
ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());//带缓存
-
-
//加载图片
-
String url = "
http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
-
//加载不到,加载失败
-
ImageLoader.ImageListener imageLister = imageLoader.getImageListener(volley_imageNet,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
-
imageLoader.get(url,imageLister);
-
}
-
-
/*
-
* netWorkImageView
-
*/
-
private void netWorkImageView(){
-
//创建一个请求队列
-
requestQueue = Volley.newRequestQueue(MainActivity.this);
-
-
//创建一个imageLoader
-
ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());
-
-
//默认图片设置
-
volley_imageNet.setImageResource(R.mipmap.ic_launcher);
-
-
//加载图片
-
String url = "
http://img5.mtime.cn/mg/2016/12/26/164311.99230575.jpg";
-
volley_imageNet.setImageURI(url,imageLoader);
-
}
-
-
@Override
-
protected void onStop() {
-
super.onStop();
-
//取消队列里所有的请求
-
requestQueue.cancelAll(this);
-
-
}
-
-
@Override
-
protected void onDestroy() {
-
super.onDestroy();
-
}
-
}
实现效果图片和代码下载地址: http://download.csdn.net/detail/u011324501/9725043