Volley相关知识

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值