android开发--volley的使用

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值