android开发--volley的使用

来源:互联网 发布:vmware linux nat模式 编辑:程序博客网 时间:2024/06/03 13:49

volley提供了1.StringRequest用来获得字串,2JsonObjectRequest,
JsonArrayRequest用来获取json数据,3.ImageLoader来获得网络图片


代码实现:get请求,服务器返回string

// 1.获得RequestQueue        // 2创建StringRequest对象        // 3equestQueue.add(stringRequest)        RequestQueue requestQueue = Volley.newRequestQueue(this);        StringRequest stringRequest = new StringRequest(Request.Method.GET,                URL_ADDRESS, new Response.Listener<String>() {                    @Override                    public void onResponse(String result) {                        // textview显示结果                        tv_title.setText(result);                    }                }, new Response.ErrorListener() {                    @Override                    public void onErrorResponse(VolleyError arg0) {                        System.out.println("网络出错");                    }                });        requestQueue.add(stringRequest);

代码实现:普通post请求,服务器返回string

// 1.获得RequestQueue        // 2创建StringRequest对象        // 3.重写StringRequest的getParams()方法        // 4.RequestQueue.add(stringRequest)        RequestQueue requestQueue = Volley.newRequestQueue(this);        StringRequest stringRequest = new StringRequest(Request.Method.POST,                URL_ADDRESS, new Response.Listener<String>() {                    @Override                    public void onResponse(String result) {                        tv_title.setText(result);                    }                }, new Response.ErrorListener() {                    @Override                    public void onErrorResponse(VolleyError arg0) {                        System.out.println("网络出错");                    }                }) {            @Override            protected Map<String, String> getParams() throws AuthFailureError {                Map<String, String> map = new HashMap<String, String>();                map.put("name", "偌渝");                map.put("age", "24");                return map;            }        };        requestQueue.add(stringRequest);

代码实现:普通请求,返回json:
// 由于volley给出的JsonRequest类修改了父类的getBody()方法,以至于其子类传参数也只能传递json数据
// 若果想通过普通请求,而返回json数据,可以自定义继承request<Json>类,不重写getbody方法即可,然后就可以通过getParams()传参了
// 1.自定义继承request类
// 2.获得RequestQueue
// 3.创建自定义request类对象
// 4.getParams()方法传递参数

自定义继承request<Json>

package com.min.myvolley;import java.io.UnsupportedEncodingException;import org.json.JSONException;import org.json.JSONObject;import com.android.volley.NetworkResponse;import com.android.volley.ParseError;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.Response.ErrorListener;import com.android.volley.Response.Listener;import com.android.volley.toolbox.HttpHeaderParser;public class JsongetPostRequest extends Request<JSONObject>{    private final Listener<JSONObject> mListener;     protected static final String PROTOCOL_CHARSET = "utf-8";    public JsongetPostRequest(int method, String url,Listener<JSONObject> listener, ErrorListener errorlistener) {        super(method, url,errorlistener);        mListener=listener;    }    @Override    protected void deliverResponse(JSONObject jsonObject) {        mListener.onResponse(jsonObject);    }    @Override    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {        try {            String jsonString = new String(response.data,                    HttpHeaderParser.parseCharset(response.headers));            return Response.success(new JSONObject(jsonString),                    HttpHeaderParser.parseCacheHeaders(response));        } catch (UnsupportedEncodingException e) {            return Response.error(new ParseError(e));        } catch (JSONException je) {            return Response.error(new ParseError(je));        }    }}

调用即可:

RequestQueue requestQueue = Volley.newRequestQueue(this);        JsongetPostRequest jsonPostRequest = new JsongetPostRequest(                Request.Method.POST, URL_ADDRESS, new Listener<JSONObject>() {                    @Override                    public void onResponse(JSONObject result) {                        // System.out.println("结果为:" + result.toString());                        tv_title.setText(result.toString());                    }                }, new ErrorListener() {                    @Override                    public void onErrorResponse(VolleyError arg0) {                    }                }) {            @Override            protected Map<String, String> getParams() throws AuthFailureError {                Map<String, String> map = new HashMap<String, String>();                map.put("name", "回眸");                map.put("age", "45");                return map;            }        };        requestQueue.add(jsonPostRequest);

代码实现:以Json请求,服务器返回jsonobject

// 1.获得RequestQueue        // 2创建json数据        // 3.创建JsonObjectRequest对象        // 4.RequestQueue.add(jsRequest)        RequestQueue requestQueue = Volley.newRequestQueue(this);        JSONObject jObject = new JSONObject();        try {            jObject.put("name", "张三那");            jObject.put("age", 23);        } catch (JSONException e) {            e.printStackTrace();        }        // ַ        JsonObjectRequest jsRequest = new JsonObjectRequest(                Request.Method.POST, URL_ADDRESS, jObject,                new Response.Listener<JSONObject>() {                    public void onResponse(JSONObject jsObject) {                        System.out.println("" + jsObject);                        tv_title.setText(jsObject.toString());                    }                }, new Response.ErrorListener() {                    public void onErrorResponse(                            com.android.volley.VolleyError arg0) {                        System.out.println("请求失败");                    }                }) {        };        requestQueue.add(jsRequest);

代码实现:获取网络图片

// 1. 创建一个RequestQueue对象。        //        // 2. 创建一个ImageLoader对象。        // ImageLoader的构造函数接收两个参数,第一个参数就是RequestQueue对象,第二个参数是一个ImageCache对象        // 写一个性能非常好的ImageCache,最好就要借助Android提供的LruCache功能        // 这里创建一个BitmapCache实现ImageCache接口        //        // 3. 在布局文件中添加一个NetworkImageView控件。        //        // 4. 在代码中获取该控件的实例。        //        // 5. 设置要加载的图片地址。        RequestQueue requestQueue = Volley.newRequestQueue(this);        ImageLoader loader = new ImageLoader(requestQueue, new BitmapCache());        nv.setDefaultImageResId(R.drawable.ic_launcher);        nv.setErrorImageResId(R.drawable.ic_launcher);        nv.setImageUrl(URL_ADDRESS, loader);

附bitmapcache类:

public class BitmapCache implements ImageCache{    private LruCache<String, Bitmap> mCache;    public BitmapCache() {        int maxsize=10*1024*1024;        mCache=new LruCache<String, Bitmap>(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);    }}

附xml:

<com.android.volley.toolbox.NetworkImageView        android:id="@+id/iv"        android:layout_width="200dp"        android:layout_height="200dp"        android:contentDescription="@string/picture" />

中文乱码问题:
修改volley中:com.android.volley.toolbox包HttpHeaderParser类的 parseCharset方法:强制改为utf-8

public static String parseCharset(Map<String, String> headers) {        return parseCharset(headers, HTTP.UTF_8);    }

0 0