前段时间参加了个mini项目,该项目是面向cosplay做的一个交流展示平台,免不了有许多图片展示。在项目中使用google 2013年推出的volley框架。

以下是我在另一篇博客中看到对volley的介绍:

我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。

不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。

Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。


接下来就开始上手了:

首先提供该代码的github的地址,哈哈就是博主自己的github了,有错误还希望及时提出。

地址:https://github.com/LxxCaroline/VolleySample.git

1.首先是volley的包,大家可以用git下载volley的源码


git clone https://android.googlesource.com/platform/frameworks/volley


然后导成jar包。或者直接使用博主的github上给的volley包。

2.volley中RequestQueue是一个可以缓存http请求的队列,当把请求加入到队列里时,queue会按照一定算法将这些request发送出去。

首先需要拿到该队列


RequestQueue mQueue = Volley.newRequestQueue(context);


之后就可以将request通过add函数加进去就好。

因为RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。

3.volley包中有一个request父类,是专门用来访问网络的,它有几个子类,一个是StringRequest和JsonRequest,但是JsonRequest是抽象类,其又有两个子类,分别是JsonObjectRequest和JsonArrayRequest,光看名字大家也应该知道这两个子类的区别了吧。

StringRequest和JsonRequest的用法是类似,只要讲一个,大家也可以类推了,具体可以看代码。


public class MainActivity extends Activity implements View.OnClickListener {

    /**
     * request queue is a queue to store all the http request.
     * send the requests concurrency according to some specific algorithm.
     * there is no need to create a request queue for each http request,else it will waste the resource.
     * so creating a request queue for every activity is already enough.
     */
    private static RequestQueue requestQueue;
    private StringRequest stringRequest;
    private JsonObjectRequest jsonObjectRequest;

    //widget
    private TextView tvResponse1, tvResponse2, tvJsonRequest1;

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

    private void initData() {
        if (requestQueue == null)
            requestQueue = Volley.newRequestQueue(MainActivity.this);
        tvResponse1 = (TextView) findViewById(R.id.tvResponse1);
        tvResponse2 = (TextView) findViewById(R.id.tvResponse2);
        tvJsonRequest1 = (TextView) findViewById(R.id.tvJsonRequest1);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnStringRequest1:
                stringRequest = new StringRequest("http://www.baidu.com", listener1, errorListener1);
                requestQueue.add(stringRequest);
                break;
            case R.id.btnStringRequest2:
                stringRequest = new StringRequest(Request.Method.GET, "http://www.baidu.com", listener2,
                        errorListener2);
                requestQueue.add(stringRequest);
                break;
            case R.id.btnJsonRequest1:
                jsonObjectRequest = new JsonObjectRequest("http://www.baidu.com", null, listener3, errorListener3);
                requestQueue.add(jsonObjectRequest);
                break;
        }
    }

    Response.Listener<String> listener1 = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            tvResponse1.setText(response);
        }
    };

    Response.ErrorListener errorListener1 = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            tvResponse1.setText(error.getMessage());
        }
    };

    Response.Listener<String> listener2 = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            tvResponse2.setText(response);
        }
    };

    Response.ErrorListener errorListener2 = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            tvResponse2.setText(error.getMessage());
        }
    };

    Response.Listener<JSONObject> listener3 = new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject jsonObject) {
            tvJsonRequest1.setText(jsonObject.toString());
        }
    };

    Response.ErrorListener errorListener3 = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            tvJsonRequest1.setText(error.getMessage());
        }
    };
}



今天就讲到这儿了,应该去吃饭了,公司太多人了。下次再说volley加载图片的方法。