Volley网络框架的简单使用

 Volley网络框架
   compile 'com.android.volley:volley:1.0.0'
 
 1. 创建一个RequestQueue(请求队列)对象。
 2. 创建一个StringRequest(字符串请求)对象。

3. StringRequest对象添加到RequestQueue里面。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private StringRequest stringRequest;//请求
    private RequestQueue mQueue;//请求队列
    private ImageView image;//图片控件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mQueue = Volley.newRequestQueue(this);//创建请求队列
        initView();

    }





GET请求:

 private void initStringRequest() {
//创建字符串请求
        stringRequest = new StringRequest(
                GET,//默认也是GET请求
                url,
                new Response.Listener() {
                    @Override//返回结果,调用该方法
                    public void onResponse(String response) {

                    }
                },
                new Response.ErrorListener() {
                    @Override//返回错位
                    public void onErrorResponse(VolleyError error) {
                    }
                }
        );
        mQueue.add(stringRequest);
    }


POST请求:

 private int page = 0;//点击按钮,会加加,改变请求的参数值
    private void initPost() {//POST请求
        String url = "http://www.tngou.net/api/lore/list";

        StringRequest sr = new StringRequest(
                POST, url,
                new Response.Listener() {
                    @Override
                    public void onResponse(String response) {
                        System.out.println("---------" + response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }
        ) {
            @Override//重写提交POST参数的方法
            protected Map getParams() throws AuthFailureError {
                Map map = new HashMap<>();
                map.put("page", page + "");//往集合里面添加POST请求的参数
                String rows = page * 5 + "";
                map.put("rows", rows);

                
                return map;//返回集合
            }
        };

        sr.setShouldCache(false);//清除缓存,可用多次请求(默认为true,不会去二次加载)
        mQueue.add(sr);

    }


请求JSON数据:
 private void initJSON() {//请求JSON数据
        String url = "http://www.tngou.net/api/lore/list";
        JSONObject jsonObject = new JSONObject();
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
                url,
                null,//可以设置为null(jsonObject)
                new Response.Listener() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray array = response.getJSONArray("tngou");
                            Log.i("MainActivity", "-------JSONArray的长度为:" + array.length());

                            for (int i = 0; i < array.length(); i++) {
                                JSONObject object = array.getJSONObject(i);
                                Log.i("MainActivity", "==================JSONObject:" + object.optString("description"));
                            }


                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }
        );

        mQueue.add(jsonObjectRequest);
    }



使用ImageRequest加载网络图片

 private void initImage() {//加载网络图片
        String url = "http://img1.imgtn.bdimg.com/it/u=771033366,2819455885&fm=21&gp=0.jpg";
        ImageRequest imageRequest = new ImageRequest(
                url,//URL
                new Response.Listener() {
                    @Override
                    public void onResponse(Bitmap response) {
                        image.setImageBitmap(response);
                    }
                },
                0,//高宽的最大值(设置为0,表示不会进行压缩)
                0,
                //ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小
                Bitmap.Config.RGB_565,//RGB_565则表示每个图片像素占据2个字节大小
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }
        );

        mQueue.add(imageRequest);
    }


使用ImageLoader加载网络图片
	
如果你觉得ImageRequest已经非常好用了,那我只能说你太容易满足了 ^_^ 实际上,Volley在请求网络图片方面可以做到的还远远不止这些,而ImageLoader就是一个很好的例子。
 ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,
 不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,
 还可以过滤掉重复的链接,避免重复发送请求。
        String url = "http://img1.imgtn.bdimg.com/it/u=771033366,2819455885&fm=21&gp=0.jpg";
        ImageLoader imageLoader = new ImageLoader(
                mQueue,
                new ImageLoader.ImageCache() {
                    @Override
                    public Bitmap getBitmap(String url) {
                        return null;
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {

                    }
                }

        );


        ImageLoader.ImageListener listener = ImageLoader.getImageListener(
                image,//图片控件
                R.mipmap.ic_launcher,//加载图片时显示的图片
                R.mipmap.ic_launcher);//加载失败时显示的图片


        //get()方法接收两个参数,第一个参数就是图片的URL地址,
        // 第二个参数则是刚刚获取到的ImageListener对象。
        // 当然,如果你想对图片的大小进行限制,也可以使用get()方法的重载,
        // 指定图片允许的最大宽度和高度,如下所示:
        imageLoader.get(url, listener);


虽然现在我们已经掌握了ImageLoader的用法,
但是刚才介绍的ImageLoader的优点却还没有使用到。
为什么呢?因为这里创建的ImageCache对象是一个空的实现,
完全没能起到图片缓存的作用。其实写一个ImageCache也非常简单,
但是如果想要写一个性能非常好的ImageCache最好就要借助Android提供的LruCache功能*/
 String url = "http://img1.imgtn.bdimg.com/it/u=771033366,2819455885&fm=21&gp=0.jpg";

        ImageLoader imageLoader=new ImageLoader(mQueue,new BitmapCache());

        ImageLoader.ImageListener listener=ImageLoader.getImageListener(
                image,
                R.mipmap.ic_launcher,
                R.mipmap.ic_launcher
        );

        imageLoader.get(url,listener);

实现 ImageLoader.ImageCache 接口:
  class BitmapCache implements ImageLoader.ImageCache{

        private LruCachemCache;//安卓类
        private BitmapCache(){
            int maxSize=10*1024*1024;//将缓存图片的大小设置为10M

            mCache=new LruCache(maxSize){
                @Override
                protected int sizeOf(String key, Bitmap bitmap) {
                    return bitmap.getRowBytes()*bitmap.getHeight();
                }
            };
        }
        @Override
        public Bitmap getBitmap(String url) {
            return mCache.get(url);
        }

        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            mCache.put(url,bitmap);
        }





你可能感兴趣的:(android框架)