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=你的key”;
//创建一个请求对象
request=new StringRequest(path, new Listener() {
@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() {
@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
}
=========
应用实例
public class ImageAdapter extends ArrayAdapter {
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 BitmapCache extends LruCache
据你对图片设置的width和heigh自动压缩该图片不会产生多的内存,还有NetworkImageView在列表中使用不会图片错误)
使用
–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
}
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 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() {
@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);
}
}