Volley是 Google 推出的 Android 異步網絡請求架構和圖檔加載架構。
Volley的特性
(1).封裝了的異步的請求API。Volley 中大多是基于接口的設計,可配置性強。
(2).一個優雅和穩健的請求隊列,一定程度符合 Http 規範,包括請求頭的處理,緩存機制的支援等。
(3).自定義的網絡圖像加載視圖(NetworkImageView,ImageLoader等) 。
(4). 提供簡便的圖檔加載工具。
本案例包含get,post請求和幾種網絡圖檔加載的方式,效果如圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUTN0UDN5IzXzlneT9lN1UDN5AzLclDMyAzLcdTMwIzLcV2YhB3cvw1ckF2bsBXdvwFdl5mLh5WaoN2cv5yYpRXY0N3Lc9CX6MHc0RHaiojIsJye.gif)
代碼:
輔助類ApplicationController.java
/**
*
*
* 使用請求隊列
* Volley的所有請求都放在一個隊列,然後進行處理,這裡是你如何将建立一個請求隊列
* @author Administrator
*
*/
public class ApplicationController extends Application {
public static RequestQueue queue;
@Override
public void onCreate() {
super.onCreate();
queue = Volley.newRequestQueue(getApplicationContext());//使用全局上下文
}
public static RequestQueue getHttpQueue() {
return queue;
}
}
網絡請求:
/****
*
* Volley之網絡請求
*
* 包含兩種 get 和 post 請求方式
*
* @author Administrator
*
*/
public class VolleyRequest extends Activity implements OnClickListener {
private RequestQueue mQueue;
TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_http);
mQueue = ApplicationController.queue;// Volley.newRequestQueue(this);
VolleyUtil.initialize(VolleyRequest.this);
initView();
}
private void initView() {
// TODO Auto-generated method stub
findViewById(R.id.get).setOnClickListener(this);
findViewById(R.id.post).setOnClickListener(this);
findViewById(R.id.get1).setOnClickListener(this);
findViewById(R.id.post1).setOnClickListener(this);
mTextView = (TextView) findViewById(R.id.textView1);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.get:
get();
break;
case R.id.get1:
get1();
break;
case R.id.post:
post();
break;
case R.id.post1:
post1();
break;
default:
break;
}
}
private void get() {
// 列如
String url = "https://www.baidu.com";
mQueue.add(new StringRequest(Method.GET, url, new Listener<String>() {
@Override
public void onResponse(String arg0) {
mTextView
.setText("------------------------------------get1----------------------------------------- \n\n"
+ arg0);
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
Toast.makeText(VolleyRequest.this, "Get請求失敗", 2).show();
}
}));
}
private void get1() {
String url = "https://www.baidu.com";
StringRequest request = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
mTextView
.setText("------------------------------------get2----------------------------------------- \n\n"
+ s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(VolleyRequest.this, "Get請求失敗", 2).show();
}
});
// 設定取消取消http請求标簽 Activity的生命周期中的onStiop()中調用
request.setTag("volleyget");
ApplicationController.getHttpQueue().add(request);
}
public void post() {
RequestQueue requestQueue = Volley.newRequestQueue(VolleyRequest.this);
StringRequest stringRequest = new StringRequest(Request.Method.POST,
"https://route.showapi.com/32-9",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
mTextView
.setText("------------------------------------post1----------------------------------------- \n\n"
+ response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(VolleyRequest.this, "請求失敗", 2).show();
}
}) {
@Override
protected Map<String, String> getParams() {
// 在這裡設定需要post的參數
return showMap();
}
};
requestQueue.add(stringRequest);
}
public void post1() {
RequestQueue requestQueue = ApplicationController.getHttpQueue();
Request<JSONObject> request = new NormalPostRequest(
"https://route.showapi.com/32-9",
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
mTextView
.setText("------------------------------------post2--------------------------------------- \n\n"
+ response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(VolleyRequest.this, "請求失敗", 2).show();
}
}, showMap());
requestQueue.add(request);
}
/***
*
* 接口POST參數
*
* @return Map
*/
private Map<String, String> showMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("q", "test");
map.put("showapi_appid", "11548");
map.put("showapi_timestamp", "20160511115654");
map.put("showapi_sign", "bb1d15ab7ce646ec87cc89d684ca4bcb");
return map;
}
@Override
protected void onStop() {
super.onStop();
ApplicationController.getHttpQueue().cancelAll("volleyget"); // 結束Activity時隊列裡面登出
mQueue.cancelAll(this); //取消這個隊列裡的所有請求:
}
}
圖檔加載:
/****
*
* Volley之圖檔加載
*
* @author Administrator
*
*/
public class VolleyImg extends Activity implements OnClickListener {
ImageView imageview1,imageview2;
NetworkImageView mNetworkImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_img);
initView();
}
private void initView() {
// TODO Auto-generated method stub
findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(this);
imageview1 = (ImageView) findViewById(R.id.img1);
imageview2 = (ImageView) findViewById(R.id.img2);
mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn1:
img1();
break;
case R.id.btn2:
img2();
break;
case R.id.btn3:
img3();
break;
default:
break;
}
}
private void img1() {
ImageRequest request = new ImageRequest("https://img-my.csdn.net/uploads/201407/26/1406383299_1976.jpg",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageview1.setImageBitmap(bitmap);
}
}, 0, 0, Config.RGB_565,
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
imageview1.setImageResource(R.drawable.ic_launcher);
}
});
VolleySingleton.getVolleySingleton(this.getApplicationContext()).addToRequestQueue(request);
}
public void img2() {
com.android.volley.toolbox.ImageLoader mImageLoader;
mImageLoader = VolleySingleton.getVolleySingleton(this.getApplicationContext()).getImageLoader();
//IMAGE_URL是圖檔網絡位址
//mImageView是ImageView執行個體
//R.drawable.def_image預設圖檔id
//R.drawable.err_image加載圖檔錯誤時的圖檔
mImageLoader.get("http://hiphotos.baidu.com/baidu/pic/item/63d0f703918fa0ec2ebf584b269759ee3d6ddb7f.jpg",
com.android.volley.toolbox.ImageLoader.getImageListener(imageview2,R.drawable.ic_launcher, R.drawable.ic_launcher));
}
/**
* 使用NetworkImageView加載圖檔
*/
public void img3()
{
com.android.volley.toolbox.ImageLoader mImageLoader;
mImageLoader = VolleySingleton.getVolleySingleton(this.getApplicationContext()).getImageLoader();
mNetworkImageView.setImageUrl("http://hiphotos.baidu.com/baidu/pic/item/f603918fa0ec08fabf7a641659ee3d6d55fbda0d.jpg", mImageLoader);
}
}
記得AndroidManifest.xml中加
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<application android:name="util.ApplicationController">
由于代碼太多,布局檔案未給出,要源碼直接下載下傳即可
源碼點選下載下傳