Volley 是 Google 推出的 Android 異步網絡請求框架和圖片加載框架。在 Google I/O 2013 大會上發佈。
Volley的優勢是:特別適合數據量小,通信頻繁的網絡操作。
Volley的主要特點是:
1.擴展性強。Volley 中大多是基於接口的設計,可配置性強。
2.一定程度符合 Http 規範,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的處理,請求頭的處理,緩存機制的支持等。並支持重試及優先級定義。
3.默認 Android2.3 及以上基於 HttpURLConnection,2.3 以下基於 HttpClient 實現。
4.提供簡便的圖片加載工具。
HTTP協議狀態碼錶示的意思主要分爲五類 ,大體是 :
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1×× 保留
2×× 表示請求成功地接收
3×× 爲完成請求客戶需進一步細化請求
4×× 客戶錯誤
5×× 服務器錯誤
Volley中會常常提到response 304,意思是,Not Modified 客戶端有緩衝的文檔併發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩衝的文檔還可以繼續使用。
我會再寫一篇博客來總結最近學的關於volley的知識點,這篇博客主要是介紹volley的使用方法。
該代碼分別實現了Volley中常用的StringRequest的get/post方法,JsonObject的get/post方法以及對圖片的網絡加載,包括ImageRequest,ImageLoader和NetworkImageView。
其中ImageRequest需要使用queue的add函數,將request加入其中。
ImageLoader和NetworkImageView則是需要使用ImageLoader,並實現一個類來繼承ImageLoader.ImageCache。
完整代碼實現:https://github.com/xiammu/VolleyTest
package com.example.simmucheng.volleytest;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
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.NetworkImageView;
import com.android.volley.toolbox.StringRequest;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private ImageView image;
private NetworkImageView networkImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InitView();
// volleyGet_RequestString();
// volleyPost_RequestString();
// volleyGet_JsonObject();
// volleyPost_JsonObject();
// volley_ImageRequest();
// volley_ImageLoader();
volley_NetworkImageView();
// volleyImg();
}
private void volley_NetworkImageView() {
String url="http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
ImageLoader loader=new ImageLoader(MyQueue.getHttpQueues(), new ImageCacheTest());
networkImageView.setDefaultImageResId(R.drawable.ic_launcher);
networkImageView.setErrorImageResId(R.drawable.ic_launcher);
networkImageView.setImageUrl(url,loader);
}
private void InitView() {
image= (ImageView) findViewById(R.id.image);
networkImageView= (NetworkImageView) findViewById(R.id.network_imageview);
}
private void volley_ImageRequest() {
String url="http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
ImageRequest imgrequest=new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
image.setImageBitmap(bitmap);
}
//0,0表示不進行壓縮,Config.RGB_565表示每個像素佔2個字節,Config.ARGB_8888表示每個像素佔4個字節等。
//第三第四個參數(maxWidth,maxHeight)指定允許圖片最大的寬度和高度,如果指定的網絡圖片的寬度或高度大於這裏的最大值
// ,則會對圖片進行壓縮,指定爲0即表示不管圖片多大都不壓縮。
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
image.setImageResource(R.drawable.ic_launcher);
}
});
MyQueue.getHttpQueues().add(imgrequest);
}
private void volley_ImageLoader() {
String url="http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
//ImageCacheTest需要實現ImageCache引用,並實現其中的兩個方法
//ImageCache是內存緩存對象,也叫L1緩存,L2緩存是磁盤緩存,內存緩存就是將展示過的圖片放入內存進行緩存,
// 磁盤緩存就是在沒有網絡的時候調出來使用
ImageLoader loader=new ImageLoader(MyQueue.getHttpQueues(),new ImageCacheTest());
//三個參數分別爲控件的id,默認的圖片,發生錯誤時展示的圖片
ImageLoader.ImageListener listener=ImageLoader.getImageListener(image,R.drawable.ic_launcher,R.drawable.ic_launcher);
loader.get(url,listener);
}
private void volleyGet_JsonObject() {
String url="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255";
JsonObjectRequest jsrequest=new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
});
jsrequest.setTag("TestTag");
MyQueue.getHttpQueues().add(jsrequest);
}
private void volleyPost_JsonObject() {
String url="http://apis.juhe.cn/mobile/get?";
Map<String,String>map=new HashMap<>();
map.put("phone","13429667914");
map.put("key", "335adcc4e891ba4e4be6d7534fd54c5d");
JSONObject jsobject=new JSONObject(map);
JsonObjectRequest jsrequest=new JsonObjectRequest(Request.Method.POST, url, jsobject, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
});
jsrequest.setTag("TestTag");//設置tag
MyQueue.getHttpQueues().add(jsrequest);
}
private void volleyPost_RequestString() {
String url1="https://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
StringRequest request=new StringRequest(Request.Method.POST, url1, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String>map=new HashMap<String, String>();
map.put("tel","15850781443");
return map;
}
};
request.setTag("TestTag");
MyQueue.getHttpQueues().add(request);
}
private void volleyImg() {
}
private void volleyGet_RequestString() {
String url="https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";
StringRequest request=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
});
request.setTag("TestTag");
MyQueue.getHttpQueues().add(request);
}
@Override
protected void onStop() {
super.onStop();
MyQueue.getHttpQueues().cancelAll("TestTag");//刪除特定的tag的request
}
}