Volley框架的使用
阿新 • • 發佈:2019-01-01
Volley框架:
volley的特性:volley適合快速,簡單的請求(Json物件,圖片載入)
1.JSON,影象等的非同步下載;
2.網路請求的排序(scheduling)
3.網路請求的優先順序處理
4.快取
5.多級別取消請求
6.和Activity和生命週期的聯動(Activity結束時同時取消所有網路請求)
1.StringRequest
載入網路資料的步驟
--首先建立請求佇列(RequestQueue)(RequestQueue只需要一個例項即可,不像AsyncTask每次使用都要new一個)
// 初始化RequestQueue一個activity只需要一個
RequestQueue mQueue=null;
private void initRequestQueue() {
mQueue = Volley.newRequestQueue(getApplicationContext());
}
----------------------------------------------
--建立請求物件(StringRequest)
StringRequest request=null;
String cityname;
try {
cityname = URLEncoder.encode("北京", "utf8");
String path="http://op.juhe.cn/onebox/weather/query?cityname="+cityname+"&dtype=&key=ea8441cb939845649b04948972f34db6";
//建立一個請求物件
request=new StringRequest(path, new Listener<String>() {
@Override
public void onResponse(String response) {
Gson gson=new Gson();
WeatherEntity entity=gson.fromJson(response, WeatherEntity.class);
Log.i("Tag", entity.toString());
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Tag", error.getMessage());
}
});
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
------------------------------------------------------
--把網路請求的物件加求請求佇列發出請求
queue.add(request);
---------------------------------------------------
--成功響應獲得String
public void onResponse(String response) {
Gson gson=new Gson();
WeatherEntity entity=gson.fromJson(response, WeatherEntity.class);
Log.i("Tag", entity.toString());
}
--失敗獲得VolleyError
public void onErrorResponse(VolleyError error) {
Log.i("Tag", error.getMessage());
}
如果需要:
// 重寫parseNetworkResponse方法改變返回頭引數解決亂碼問題
// 主要是看伺服器編碼,如果伺服器編碼不是UTF-8的話那麼就需要自己轉換,反之則不需要
StringRequest srReq = new StringRequest(Request.Method.GET, url,
new StrListener(), new StrErrListener()) {
protected final String TYPE_UTF8_CHARSET = "charset=UTF-8";
// 重寫parseNetworkResponse方法改變返回頭引數解決亂碼問題
// 主要是看伺服器編碼,如果伺服器編碼不是UTF-8的話那麼就需要自己轉換,反之則不需要
@Override
protected Response<String> parseNetworkResponse(
NetworkResponse response) {
try {
String type = response.headers.get(HTTP.CONTENT_TYPE);
if (type == null) {
type = TYPE_UTF8_CHARSET;
response.headers.put(HTTP.CONTENT_TYPE, type);
} else if (!type.contains("UTF-8")) {
type += ";" + TYPE_UTF8_CHARSET;
response.headers.put(HTTP.CONTENT_TYPE, type);
}
} catch (Exception e) {
}
return super.parseNetworkResponse(response);
}
};
request.setShouldCache(true);//控制是否快取
-----------------------------------------------------
2.Volley圖片的處理方式
--ImageRequest
=======
@param url
* 圖片地址
* @param listener
* @param maxWidth
* 指定允許圖片最大的寬度
* @param maxHeight
* 指定允許圖片最大的高度
* @param decodeConfig
* 指定圖片的顏色屬性,Bitmap.Config下的幾個常量.
* @param errorListener
--少量圖片載入不需快取處理會對獲得的圖片進行壓縮處理
RequestQueue queue=Volley.newRequestQueue(this);
---------------------------------------------------
String url="http://172.60.25.9:8080/MusicServer/images/pingfanzhilu.jpg";
ImageRequest request=new ImageRequest(url, new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
iamge.setImageBitmap(response);
}
}, 0, 0, Config.ARGB_8888,new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Tag", error.getMessage());
}
});
--------------------
queue.add(request);
===================
--ImageLoader
--具有本地快取功能的圖片載入器,快取空間需要自定義
課堂案例:
--------------
public class ImageLoaderActivity extends Activity {
ImageView imageView_loader=null;
RequestQueue queue=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_loader);
imageView_loader=(ImageView) findViewById(R.id.imageView_loader);
queue=Volley.newRequestQueue(this);
}
public void imageloader(View view){
ImageLoader loader=new ImageLoader(queue, new ImageCache() {
int maxSize=1024*1024*4;
LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(maxSize){
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
};
};
@Override
public void putBitmap(String url, Bitmap bitmap) {
//把載入成功的圖片存入快取
cache.put(url, bitmap);
}
@Override
public Bitmap getBitmap(String url) {
//從快取中獲得圖片
return cache.get(url);
}
});
String url="http://172.60.50.50:8080/MusicServer/images/disanji.jpg";
ImageListener listener=ImageLoader.getImageListener(
imageView_loader,
R.drawable.ic_launcher,
R.drawable.ic_launcher);
loader.get(url, listener);
}
}
=========
=========
應用例項
----------------------------------------------
public class ImageAdapter extends ArrayAdapter<String> {
private RequestQueue mQueue;
private ImageLoader mImageLoader;
public ImageAdapter(Context context, List<String> objects) {
super(context, 0, objects);
mQueue = Volley.newRequestQueue(getContext());
mImageLoader = new ImageLoader(mQueue, new BitmapCache());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String url = getItem(position);
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(getContext());
} else {
imageView = (ImageView) convertView;
}
// getImageListener(imageView控制元件物件,預設圖片地址,失敗圖片地址);
ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);
// get(圖片地址,listener,寬,高);自動幫你處理圖片的寬高再也不怕大圖片的oom了
mImageLoader.get(url, listener,100,200);
return imageView;
}
}
--------------還需重寫ImageCache這個類
public class <span style="font-family: Arial;">BitmapCache</span><span style="font-family: Arial;"> extends LruCache<String, Bitmap> implements ImageCache {</span>
// LruCache 原理:Cache儲存一個強引用來限制內容數量,每當Item被訪問的時候,此Item就會移動到佇列的頭部。 當cache已滿的時候加入新的item時,在佇列尾部的item會被回收。
// 解釋:當超出指定記憶體值則移除最近最少用的圖片記憶體
public static int getDefaultLruCacheSize() {
// 拿到最大記憶體
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// 拿到記憶體的八分之一來做圖片記憶體快取
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public BitmapLruCache() {
this(getDefaultLruCacheSize());
}
public BitmapLruCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
--NetWorkImageView
載入圖片的控制元件com.android.volley.NetworkImageView
這個控制元件在被從父控制元件detach的時候,會自動取消網路請求的,即完全不用我們擔心相關網路請求的生命週期問題,而且NetworkImageView還會根據你對圖片設定的width和heigh自動壓縮該圖片不會產生多的記憶體,還有NetworkImageView在列表中使用不會圖片錯誤)
-----
使用
----
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image_view"
android:layout_width="100dp"
android:layout_height="100dp" />
--Volley框架定義圖片控制具有載入並快取圖片的能力
------
課堂案例:
-----
public class NetWorkImageActivity extends Activity {
NetworkImageView imageView=null;
RequestQueue queue=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_net_work_image);
imageView=(NetworkImageView) findViewById(R.id.imageview_network);
queue=Volley.newRequestQueue(this);
imageView.setDefaultImageResId(R.drawable.ic_launcher);
imageView.setErrorImageResId(R.drawable.ic_launcher);
}
public void loadnetwork(View view){
ImageLoader loader=new ImageLoader(queue, new ImageCache() {
int maxSize=1024*1024*4;
LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(maxSize){
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
};
};
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
});
String url="http://172.60.50.50:8080/MusicServer/images/disanji.jpg";
imageView.setImageUrl(url, loader);
}
}
----------
3.JsonRequest
------
課堂案例:
public class BlankActivity extends Activity {
RequestQueue queue=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blank);
queue=Volley.newRequestQueue(this);
}
public void onclick(View v){
JsonRequest<JSONObject> jsonRequest = null;
try {
String cityname = URLEncoder.encode("北京", "utf8");
String path = "http://op.juhe.cn/onebox/weather/query?cityname=" + cityname
+ "&dtype=&key=ea8441cb939845649b04948972f34db6";
jsonRequest = new JsonObjectRequest(path, null, new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i("tag", response.toString());
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
} catch (Exception e) {
}
queue.add(jsonRequest);
}
}
4.自定義Volley請求物件
繼承Reqeust<T>父類
volley的特性:volley適合快速,簡單的請求(Json物件,圖片載入)
1.JSON,影象等的非同步下載;
2.網路請求的排序(scheduling)
3.網路請求的優先順序處理
4.快取
5.多級別取消請求
6.和Activity和生命週期的聯動(Activity結束時同時取消所有網路請求)
1.StringRequest
載入網路資料的步驟
--首先建立請求佇列(RequestQueue)(RequestQueue只需要一個例項即可,不像AsyncTask每次使用都要new一個)
// 初始化RequestQueue一個activity只需要一個
RequestQueue mQueue=null;
private void initRequestQueue() {
mQueue = Volley.newRequestQueue(getApplicationContext());
}
----------------------------------------------
--建立請求物件(StringRequest)
StringRequest request=null;
String cityname;
try {
cityname = URLEncoder.encode("北京", "utf8");
String path="http://op.juhe.cn/onebox/weather/query?cityname="+cityname+"&dtype=&key=ea8441cb939845649b04948972f34db6";
//建立一個請求物件
request=new StringRequest(path, new Listener<String>() {
@Override
public void onResponse(String response) {
Gson gson=new Gson();
WeatherEntity entity=gson.fromJson(response, WeatherEntity.class);
Log.i("Tag", entity.toString());
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Tag", error.getMessage());
}
});
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
------------------------------------------------------
--把網路請求的物件加求請求佇列發出請求
queue.add(request);
---------------------------------------------------
--成功響應獲得String
public void onResponse(String response) {
Gson gson=new Gson();
WeatherEntity entity=gson.fromJson(response, WeatherEntity.class);
Log.i("Tag", entity.toString());
}
--失敗獲得VolleyError
public void onErrorResponse(VolleyError error) {
Log.i("Tag", error.getMessage());
}
如果需要:
// 重寫parseNetworkResponse方法改變返回頭引數解決亂碼問題
// 主要是看伺服器編碼,如果伺服器編碼不是UTF-8的話那麼就需要自己轉換,反之則不需要
StringRequest srReq = new StringRequest(Request.Method.GET, url,
new StrListener(), new StrErrListener()) {
protected final String TYPE_UTF8_CHARSET = "charset=UTF-8";
// 重寫parseNetworkResponse方法改變返回頭引數解決亂碼問題
// 主要是看伺服器編碼,如果伺服器編碼不是UTF-8的話那麼就需要自己轉換,反之則不需要
@Override
protected Response<String> parseNetworkResponse(
NetworkResponse response) {
try {
String type = response.headers.get(HTTP.CONTENT_TYPE);
if (type == null) {
type = TYPE_UTF8_CHARSET;
response.headers.put(HTTP.CONTENT_TYPE, type);
} else if (!type.contains("UTF-8")) {
type += ";" + TYPE_UTF8_CHARSET;
response.headers.put(HTTP.CONTENT_TYPE, type);
}
} catch (Exception e) {
}
return super.parseNetworkResponse(response);
}
};
request.setShouldCache(true);//控制是否快取
-----------------------------------------------------
2.Volley圖片的處理方式
--ImageRequest
=======
@param url
* 圖片地址
* @param listener
* @param maxWidth
* 指定允許圖片最大的寬度
* @param maxHeight
* 指定允許圖片最大的高度
* @param decodeConfig
* 指定圖片的顏色屬性,Bitmap.Config下的幾個常量.
* @param errorListener
--少量圖片載入不需快取處理會對獲得的圖片進行壓縮處理
RequestQueue queue=Volley.newRequestQueue(this);
---------------------------------------------------
String url="http://172.60.25.9:8080/MusicServer/images/pingfanzhilu.jpg";
ImageRequest request=new ImageRequest(url, new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
iamge.setImageBitmap(response);
}
}, 0, 0, Config.ARGB_8888,new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Tag", error.getMessage());
}
});
--------------------
queue.add(request);
===================
--ImageLoader
--具有本地快取功能的圖片載入器,快取空間需要自定義
課堂案例:
--------------
public class ImageLoaderActivity extends Activity {
ImageView imageView_loader=null;
RequestQueue queue=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_loader);
imageView_loader=(ImageView) findViewById(R.id.imageView_loader);
queue=Volley.newRequestQueue(this);
}
public void imageloader(View view){
ImageLoader loader=new ImageLoader(queue, new ImageCache() {
int maxSize=1024*1024*4;
LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(maxSize){
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
};
};
@Override
public void putBitmap(String url, Bitmap bitmap) {
//把載入成功的圖片存入快取
cache.put(url, bitmap);
}
@Override
public Bitmap getBitmap(String url) {
//從快取中獲得圖片
return cache.get(url);
}
});
String url="http://172.60.50.50:8080/MusicServer/images/disanji.jpg";
ImageListener listener=ImageLoader.getImageListener(
imageView_loader,
R.drawable.ic_launcher,
R.drawable.ic_launcher);
loader.get(url, listener);
}
}
=========
=========
應用例項
----------------------------------------------
public class ImageAdapter extends ArrayAdapter<String> {
private RequestQueue mQueue;
private ImageLoader mImageLoader;
public ImageAdapter(Context context, List<String> objects) {
super(context, 0, objects);
mQueue = Volley.newRequestQueue(getContext());
mImageLoader = new ImageLoader(mQueue, new BitmapCache());
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String url = getItem(position);
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(getContext());
} else {
imageView = (ImageView) convertView;
}
// getImageListener(imageView控制元件物件,預設圖片地址,失敗圖片地址);
ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);
// get(圖片地址,listener,寬,高);自動幫你處理圖片的寬高再也不怕大圖片的oom了
mImageLoader.get(url, listener,100,200);
return imageView;
}
}
--------------還需重寫ImageCache這個類
public class <span style="font-family: Arial;">BitmapCache</span><span style="font-family: Arial;"> extends LruCache<String, Bitmap> implements ImageCache {</span>
// LruCache 原理:Cache儲存一個強引用來限制內容數量,每當Item被訪問的時候,此Item就會移動到佇列的頭部。 當cache已滿的時候加入新的item時,在佇列尾部的item會被回收。
// 解釋:當超出指定記憶體值則移除最近最少用的圖片記憶體
public static int getDefaultLruCacheSize() {
// 拿到最大記憶體
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
// 拿到記憶體的八分之一來做圖片記憶體快取
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public BitmapLruCache() {
this(getDefaultLruCacheSize());
}
public BitmapLruCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
--NetWorkImageView
載入圖片的控制元件com.android.volley.NetworkImageView
這個控制元件在被從父控制元件detach的時候,會自動取消網路請求的,即完全不用我們擔心相關網路請求的生命週期問題,而且NetworkImageView還會根據你對圖片設定的width和heigh自動壓縮該圖片不會產生多的記憶體,還有NetworkImageView在列表中使用不會圖片錯誤)
-----
使用
----
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image_view"
android:layout_width="100dp"
android:layout_height="100dp" />
--Volley框架定義圖片控制具有載入並快取圖片的能力
------
課堂案例:
-----
public class NetWorkImageActivity extends Activity {
NetworkImageView imageView=null;
RequestQueue queue=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_net_work_image);
imageView=(NetworkImageView) findViewById(R.id.imageview_network);
queue=Volley.newRequestQueue(this);
imageView.setDefaultImageResId(R.drawable.ic_launcher);
imageView.setErrorImageResId(R.drawable.ic_launcher);
}
public void loadnetwork(View view){
ImageLoader loader=new ImageLoader(queue, new ImageCache() {
int maxSize=1024*1024*4;
LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(maxSize){
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
};
};
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
});
String url="http://172.60.50.50:8080/MusicServer/images/disanji.jpg";
imageView.setImageUrl(url, loader);
}
}
----------
3.JsonRequest
------
課堂案例:
public class BlankActivity extends Activity {
RequestQueue queue=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blank);
queue=Volley.newRequestQueue(this);
}
public void onclick(View v){
JsonRequest<JSONObject> jsonRequest = null;
try {
String cityname = URLEncoder.encode("北京", "utf8");
String path = "http://op.juhe.cn/onebox/weather/query?cityname=" + cityname
+ "&dtype=&key=ea8441cb939845649b04948972f34db6";
jsonRequest = new JsonObjectRequest(path, null, new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i("tag", response.toString());
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
} catch (Exception e) {
}
queue.add(jsonRequest);
}
}
4.自定義Volley請求物件
繼承Reqeust<T>父類