使用Google Volley框架访问服务端,为Listview加载图片。

2 篇文章 0 订阅
1 篇文章 0 订阅

Volley网络访问框架是去年I/O大会正式推出的,自然在安卓系统架构中也是会得到很大的支持的,它内部创建线程池,往请求队列中添加请求对象,然后由内部线程池分配线程来执行任务,它适合做请求次数多,数据量较小的情景下使用,如果数据量太大将会非常影响体验,在下面我们将通过一个Listview加载网络图片的例子来介绍它,在介绍它之前,我们先来了解一下他的两种访问方法:最常见的GET和POST。

1.Volley使用GET方法请求服务端:

RequestQueue queue = Volley.newRequestQueue(getApplicationContext());//创建请求队列
StringRequest request = new StringRequest(Method.GET,
                    "http://172.16.10.18:8080/Servlet/index.jsp?hello=hello",
                    new Response.Listener<String>() {

                        @Override
                        public void onResponse(String response) {
                            Toast.makeText(MainActivity.this, response.trim(),
                                    Toast.LENGTH_SHORT).show();
                        }
                    }, new Response.ErrorListener() {

                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Toast.makeText(MainActivity.this,
                                    error.getMessage(), Toast.LENGTH_SHORT)
                                    .show();
                        }
                    });
            queue.add(request);
            queue.start();
StringRequest构造方法传入访问方式(Method.GET) ,URL地址,后面就是两个回调接口,分别在请求成功和失败的时候调用。创建完成以后就加入到queue队列中,调用start方法发出请求访问。这个queue里面是可以存放多条请求的,然后在调用start的时候一条条的去执行。
2.Volley使用POST方法请求服务端:这个就有点隐蔽了,并不像前面的GET一样可以直接调用。
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());//创建请求队列
StringRequest request = new StringRequest(Method.POST,
                    "http://172.16.10.18:8080/Servlet/index.jsp", sucListener,
                    failListener) {
                @Override
                protected Map<String, String> getParams()
                        throws AuthFailureError {
                    Map<String, String> params = new HashMap<>();
                    params.put("hello", "hello");
                    return params;
                }
            };
            queue.add(request);
            queue.start();
这个是创建request方法里面的sucListener,failListener是实现了相应接口的两个类,处理跟之前的GET使用了相同的方式。这里主要的不同是在url里面只传了服务器地址,没有传参数,参数是在StringRequest里面的重写了父类方法,因为在创建request的时候调用post方法的话,执行请求的时候,请求队列会去拿这个方法返回的值作为参数。

了解上面的GET和POST方法之后,我们来创建这个使用Volley加载图片的Demo吧。

图片的加载主要就是adapter的编写了。

public MyAdapter(Context context, List<String> list) {
        this.list = list;
        this.context = context;
        queue = App.getRequestQueue();
        width = context.getResources().getDimensionPixelSize(
                R.dimen.list_item_image_height);
    }

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(
                    R.layout.list_item, null);
            holder.itemImage = (ImageView) convertView
                    .findViewById(R.id.item_image);
            holder.itemTxt = (TextView) convertView
                    .findViewById(R.id.item_text);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();
        final ImageView imageView = holder.itemImage;
        holder.itemTxt.setText(list.get(position));
        imageRequest = new ImageRequest(list.get(position),
                new Response.Listener<Bitmap>() {

                    @Override
                    public void onResponse(Bitmap response) {
                        imageView.setImageBitmap(response);
                    }
                }, width, width, Config.ARGB_8888, new ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        imageView.setBackgroundResource(R.drawable.ic_launcher);

                    }
                });
        queue.add(imageRequest);
        queue.start();
        return convertView;
    }
我们在构造适配器的时候传进来了一个list对象,里面存放的就是接下来我们要加载的图片的地址了。在每一次调用getView方法的时候,我们都创建一个ImageRequest进行图片的加载,这个里面多了两个参数,长度和宽度,就是图片加载出来显示的做大尺寸。创建对应的资源文件,然后创建这个适配器就可以完成一个网络图片的listview了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值