1-1:
Volley特点:
1.通信更快,更简单
2.get、post网络请求及网络图像的高效率异步处理请求(已经帮我们处理好了异步化)
3.排序(根据网络请求优先级进行排序)
4.网络请求的缓存
5.多级别取消请求
6.和activity生命周期的联动(这样当退出activity时,就取消网络请求,避免性能问题)
Volley缺点:
不适合数据的上传和下载。
为什么使用Volley:
功能上:
1.高效的get/post方式的数据请求交互
2.网络图片加载和缓存
其他:
谷歌官方推出
性能很稳定和强劲
1-2:
get和post请求接口数据的使用
挑选合适的对象:
StringRequest(当我们对request返回的结果类型不确定时,因为StringRequest包含了后面两种)
JsonObjectRequest(当确定返回是JsonObject时)
JsonArrayRequest(当确定返回是JsonArray时)
与activity生命周期联动:
特点:
可以在activity销毁时候,同时关闭请求
关键点:
设置Tag标签,onStop里执行取消请求
1-3:
//全局的请求队列
public class MyApplication extends Application {
public static RequestQueue queues;
@Override
public void onCreate() {
super.onCreate();
queues = Volley.newRequestQueue(getApplicationContext());
}
//暴露一个方法,获取请求队列
public static RequestQueue getHttpQueues(){
return queues;
}
}
//之后在manifest中设置application的android:name
//用例
private void volleyGet(){
//成功
class SuccessListener implements Response.Listener<String> {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show();;
}
}
//失败
class ErrorListener implements Response.ErrorListener{
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
}
}
String url = "http://apis.juhe.cn/mobile/get?phone=13718590919&key=335adcc4e891ba4e4be6d7534fd54c5d";
SuccessListener successListener = new SuccessListener();
ErrorListener errorListener = new ErrorListener();
StringRequest request = new StringRequest(Request.Method.GET,url,successListener,errorListener);
//设置tag
request.setTag("abcGet");
//加入队列
MyApplication.getHttpQueues().add(request);
}
get方式将所有的需要的请求参数都写到了url中,post需要另外填入请求参数。
getParams()方法:用户在Volley中使用post方式请求数据中参数的传递。
private void volleyPost(){
//成功
class SuccessListener implements Response.Listener<String> {//String(StringRequest)或Object(JsonObjectRequest)
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this,response.toString(),Toast.LENGTH_LONG).show();;
}
}
//失败
class ErrorListener implements Response.ErrorListener{
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
}
}
String url = "http://apis.juhe.cn/mobile/get?";
SuccessListener successListener = new SuccessListener();
ErrorListener errorListener = new ErrorListener();
StringRequest request = new StringRequest(Request.Method.POST,url,successListener,errorListener){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//创建hashMap,将需要传递的参数放在map中
Map<String,String> hashMap = new HashMap<>();
hashMap.put("phone","13778103370");
hashMap.put("key","0daac515f9692696b13ca41d1ee91b11");
return hashMap;
}
};
//测试不能用,至今不知为什么
//使用JsonObjectRequest,需要创建jsonObject,其作用是将map包装一下,传递参数用
// Map<String,String> hashMap = new HashMap<>();
// hashMap.put("phone","13718590919");
// hashMap.put("key","0daac515f9692696b13ca41d1ee91b11");
// JSONObject jsonObject = new JSONObject(hashMap);
// JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, jsonObject, new Response.Listener<JSONObject>() {
// @Override
// public void onResponse(JSONObject response) {
// Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_LONG).show();
// }
// }, new Response.ErrorListener() {
// @Override
// public void onErrorResponse(VolleyError error) {
// Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();
// }
// });
//设置tag
request.setTag("abcPost1");
//加入队列
MyApplication.getHttpQueues().add(request);
}
队列的cancelAll()方法:通过给定的tag值,将指定的队列全部关闭。
二次简单封装好处:
请求成功和失败可以进行全局的控制。这样对于全局性的东西,不需要再每个请求的都写同样的控制样板代码了。
二次封装代码:
//对volley进行二次封装
public class VolleyRequest {
public static StringRequest stringRequest;
public static Context mContext;
//传递接口
public static void RequestGet(Context context,String url,String tag,VolleyInterface vif){
MyApplication.getHttpQueues().cancelAll(tag);
stringRequest = new StringRequest(Request.Method.GET,url,vif.loadingListener(),vif.loadingErrorListener());
stringRequest.setTag(tag);
MyApplication.getHttpQueues().add(stringRequest);
MyApplication.getHttpQueues().start();
}
//自定义post
public static void RequestPost(Context context,String url,String tag, final Map<String,String>params,VolleyInterface vif){
MyApplication.getHttpQueues().cancelAll(tag);
stringRequest = new StringRequest(Request.Method.POST,url,vif.loadingListener(),vif.loadingErrorListener()){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//返回传递进来的参数
return params;
}
};
stringRequest.setTag(tag);
MyApplication.getHttpQueues().add(stringRequest);
MyApplication.getHttpQueues().start();
}
}
public abstract class VolleyInterface {
public Context mContext;
public Response.Listener<String> mListener;
public Response.ErrorListener mErrorListener;
public VolleyInterface(Context context){
this.mContext = context;
// this.mListener = listener;
// this.mErrorListener = errorListener;
}
public Response.Listener<String> loadingListener(){
mListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//便于进行全局控制
//比如弹出加载中的对话框
onMysuccess(response);
}
};
return mListener;
}
public Response.ErrorListener loadingErrorListener(){
mErrorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError response) {
onMyError(response);
//便于进行全局控制
//比如提示请求失败
}
};
return mErrorListener;
}
//交给子类重写
public abstract void onMysuccess(String result);
public abstract void onMyError(VolleyError error);
}
//用例代码
//二次封装试验
String url = "http://apis.juhe.cn/mobile/get?phone=13718590919&key=0daac515f9692696b13ca41d1ee91b11";
VolleyRequest.RequestGet(this, url, "abcGet", new VolleyInterface(this) {
@Override
public void onMysuccess(String result) {
//写不是全局性的代码
Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();;
}
@Override
public void onMyError(VolleyError error) {
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();;
}
});
String url1 = "http://apis.juhe.cn/mobile/get?phone=13778103370&key=0daac515f9692696b13ca41d1ee91b11";
VolleyRequest.RequestGet(this, url1, "abc1Get", new VolleyInterface(this) {
@Override
public void onMysuccess(String result) {
Toast.makeText(MainActivity.this,"成功了",Toast.LENGTH_LONG).show();;
}
@Override
public void onMyError(VolleyError error) {
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show();;
}
});
4-1:
加载图片缓存功能简单介绍:1.LruCache 2.ImageCache
加载网络图片及监听:
1.ImageRequest 2.ImageLoader 3.NetworkImageView(或普通ImageView)
imageCache单独使用是起不到缓存效果的,所以要结合LruCache。
NetworkImageView需要搭配ImageLoader 使用。
ImageRequest imageRequest = new ImageRequest(url,listener,maxWidth,maxHeight, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888,errorListener);
ImageLoader imageLoader = new ImageLoader(MyApplication.getHttpQueues(),new BitmapCache());//自定义BitmapCache类
//getImageListener返回默认的listener,你也可以自定义listener
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,defaultImage,errorImage);
imageLoader.get(url, listener);
NetworkImageView networkImageView;//通过findViewById找到
networkImageView.setDefaultImageResId(defaultImage);
networkImageView.setErrorImageResId(errorImage);
networkImageView.setImageUrl(url,imageLoader);//跟imageLoader配合使用
//内部使用LruCache进行缓存
public class BitmapCache implements ImageLoader.ImageCache{
public LruCache<String,Bitmap> cache;
public int maxSize = 10*1024*1024;
public BitmapCache(){
cache = new LruCache<String,Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url,bitmap);
}
}