Volley的用法

1.volley是android上的网络通信库

2.volley通信的特点:

1.通信更快更简洁
2.可以处理get/post网络请求以及网络图像的高效率的异步请求
3.可以处理网络请求图片的加载和缓存
4.可以取消请求
5.和activity生命周期的联动,activity销毁后,请求同时关闭。
6.不适合做上传和下载的的操作

3.请求的对象有:

StringRequest是普通http请求,
JsonObjectRequest,JsonArrayRequest::JsonRequest可以封装json数据,并将服务端的返回数据封装成JsonObject,
ImageRequest可以请求一张网络图片,并将服务端的返回数据封装成Bitmap。

4.volley的get/post请求方式的时候用。

volley使用及其简单,我们只需要创建一个RequestQueue请求队列,然后往队列里面扔http请求即可,volley会不断从队列里面取出请求然后交给一堆工作线程处理。这里的http请求是通过Request类来封装的,我们只用创建Request对象,然后提供诸如url之类的参数即可。网络操作全部是在子线程中处理的,我们不必担心阻塞UI线程。网络请求的结果会异步返回给我们,我们只需要处理Request的回调即可。
1.导入volley.jar文件到libs中
2.请求创建好一般会放到请求队列中去,所以我在application中创建了一个全局共享RequestQueue
public class MyApplication extends Application {

    // 创建一个全局的请求队列
    public static RequestQueue queues;


    @Override
    public void onCreate() {
        super.onCreate();
        queues = Volley.newRequestQueue(getApplicationContext());
    }

    public static RequestQueue getHttpQueue(){
        return queues;
    }

}

注意在manifest.xml文件中进行注册android:name=”.MyApplication”。以及要添加网络请求的权限,需要注意的是,android studio中添加权限和eclipse添加权限不同,as需要手动的添加。

3.创建get请求(StringRequest 和JsonObjectRequest )
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 创建get请求
        Volley_get();
    }

    private void Volley_get() {
     /**
         *StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener)
         * 请求方法,请求的路径,请求成功的监听,请求失败的监听
         */
        String url = "";
        StringRequest requestGet = new StringRequest(Request.Method.GET, url,new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Toast.makeText(MainActivity.this,"请求成功",Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
            }
        });
        // 设置标签
        requestGet.setTag("get");
        // 将请求添加到请求队列中
        MyApplication.getHttpQueue().add(requestGet);

//如果json数据为空则是get请求,否则是post请求
        //如果jsonrequest不为null,volley会将jsonObject对象转化为json字符串原封不动的发给服务器,并不会转成k-v对,因为volley不知道应该如何转化
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null
                , new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Toast.makeText(MainActivity.this,"请求成功",Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
            }
        });
        // 设置标签
        requestGet.setTag("get");
        // 将请求添加到请求队列中
        MyApplication.getHttpQueue().add(jsonObjectRequest);
    }
4.创建post请求(StringRequest 和JsonObjectRequest )
 private void Volley_post() {
        String url = "";//post请求的链接,值没有在url中传递
        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Toast.makeText(MainActivity.this,"请求成功",Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
            }
        }){
            // volley中用于post方法进行参数的传递
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> hashMap = new HashMap<>();
                hashMap.put("name", "zhangsan");
                hashMap.put("pwd", "123");
                return hashMap;
            }
        };
    }

 Map<String, String> map = new HashMap<>();
        map.put("name", "zhangsan");
        map.put("pwd", "123");
        JSONObject jsonObject = new JSONObject(map);
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, jsonObject, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Toast.makeText(MainActivity.this,"请求成功",Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
            }
        });
        // 设置标签
        jsonObjectRequest.setTag("get");
        // 将请求添加到请求队列中
        MyApplication.getHttpQueue().add(jsonObjectRequest);

5.volley与activity的生命周期的联动,在onStop()或者是onDestory()方法中取消之前设置的标签即可。

@Override
    protected void onStop() {
        super.onStop();
        MyApplication.getHttpQueue().cancelAll("post");
        MyApplication.getHttpQueue().cancelAll("get");
    }

6.获取到网络图片imageRequest

LruCache:
ImageCache:
ImageRequest:
ImageLoader:
NetWorkImageView:

 /**
         * ImageRequest(String url, Listener<Bitmap> listener,
         * int maxWidth, int maxHeight, Config decodeConfig, ErrorListener errorListener)
         * int maxWidth, int maxHeight, 设置显示的图片的高度和宽度
         * Config decodeConfig,以什么样的颜色来显示
         */
        String url = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png";
        ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap bitmap) {
                // 请求成功
                mimage.setImageBitmap(bitmap);
            }
            参数0,0 代表不压缩,100,100代表图片宽高
        }, 100, 100, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_LONG).show();
                mimage.setImageResource(R.mipmap.ic_launcher);
            }
        });
        imageRequest.setTag("image");
        MyApplication.getHttpQueue().add(imageRequest);
    }

    private void initView() {
        mimage = (ImageView) findViewById(R.id.image);
    }

7.获取到网络图片imageLoader

首先创建RequestQueue不用多说,然后创建ImageLoader实例,同时需要传入请求队列和ImageCache。这个ImageCache是一个接口,我们需要自己实现,它是一个图片缓存,通常我们都是结合LRUCache作为内存缓存使用,当然,如果你不想使用内存缓存,那就给它一个空实现即可。紧接着,需要为ImageLoader绑定ImageView以及图片加载时、图片加载失败时的图片资源。最后调用get方法传入url请求网络。
1.创建bitmapcache的缓存类
public class BitMapCache implements ImageLoader.ImageCache {

    private LruCache<String, Bitmap> mCache;
    private int max = 10 * 1024 * 1024; // 设置最大的缓存大小

    public BitMapCache() {
        mCache = new LruCache<String,Bitmap>(max){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getRowBytes() * value.getHeight();

            }
        };
}
    @Override
    public Bitmap getBitmap(String s) {
        return mCache.get(s);
    }

    @Override
    public void putBitmap(String s, Bitmap bitmap) {
        mCache.put(s, bitmap);
    }
}
2.在activity中创建imageLoader
  ImageLoader imageloader = new ImageLoader(MyApplication.getHttpQueue(), new BitMapCache());
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(mimage,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
        imageloader.get(url, listener);

8.获取到网络图片networkimageview,该控件任然需要和imageloader搭配使用

 <com.android.volley.toolbox.NetworkImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/networkimageview"/>
  networkimageview = (NetworkImageView) findViewById(R.id.networkimageview);
  ImageLoader imageloader = new ImageLoader(MyApplication.getHttpQueue(), new BitMapCache());
        networkimageview.setDefaultImageResId(R.mipmap.ic_launcher);
        networkimageview.setErrorImageResId(R.mipmap.ic_launcher);
        networkimageview.setImageUrl(url,imageloader);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值