Android 谷歌 开源 通信框架 VOLLEY(四)——定制请求

来源:互联网 发布:java代码打包成jar包 编辑:程序博客网 时间:2024/06/05 02:19

三、定制请求

了解了volley自带的默认功能,觉得很方便吧,其实volley的强大远远不止于此。就像网络上传输的数据通常有两种格式,JSON和XML,那么如果想要请求一条XML格式的数据该怎么办呢?
下面我们就来看下volley怎么处理这种不常见的数据格式。
这里写图片描述

package com.example.VolleyDemo;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.widget.TextView;import android.widget.Toast;import com.android.volley.*;import com.android.volley.toolbox.HttpHeaderParser;import com.android.volley.toolbox.Volley;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import java.io.IOException;import java.io.StringReader;import java.io.UnsupportedEncodingException;import static com.android.volley.Response.*;public class XmlActivity extends Activity {    private TextView mXmlResult;    private StringBuffer mBuffer = new StringBuffer();    /**     * Called when the activity is first created.     */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_xml);        mXmlResult = (TextView) findViewById(R.id.XmlTxt);    }    RequestQueue mQueue;    @Override    protected void onStart() {        super.onStart();        /********************4步骤********************/        //1.创建一个RequestQueue对象        mQueue = Volley.newRequestQueue(this);        //2.启动RequestQueue        mQueue.start();        //3.创建一个XMLRequest        XMLRequest xmlRequest = new XMLRequest(                "http://flash.weather.com.cn/wmaps/xml/china.xml",                new Response.Listener<XmlPullParser>() {                    @Override                    public void onResponse(XmlPullParser response) {                        try {                            int eventType = response.getEventType();                            while (eventType != XmlPullParser.END_DOCUMENT) {                                switch (eventType) {                                    case XmlPullParser.START_TAG:                                        String nodeName = response.getName();                                        if ("city".equals(nodeName)) {                                            String pName = response.getAttributeValue(0);                                            Log.d("TAG", "pName is " + pName);                                            mBuffer.append(pName);                                        }                                        break;                                }                                eventType = response.next();                            }                        } catch (XmlPullParserException e) {                            e.printStackTrace();                        } catch (IOException e) {                            e.printStackTrace();                        }                        mXmlResult.setText(mBuffer.toString());                    }                }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {                Log.e("TAG", error.getMessage(), error);                Toast.makeText(XmlActivity.this, "网络错误", Toast.LENGTH_SHORT).show();            }        });        //4.将XmlRequest对象添加到RequestQueue里面        mQueue.add(xmlRequest);        /******************************************/    }    @Override    protected void onDestroy() {        super.onDestroy();        if(mQueue!=null){            mQueue.cancelAll(this);        }    }    class XMLRequest extends Request<XmlPullParser> {        private final Listener<XmlPullParser> mListener;        public XMLRequest(int method, String url, Listener<XmlPullParser> listener,                          ErrorListener errorListener) {            super(method, url, errorListener);            mListener = listener;        }        public XMLRequest(String url, Listener<XmlPullParser> listener, ErrorListener errorListener) {            this(Method.GET, url, listener, errorListener);        }        @Override        protected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {            try {                String xmlString = new String(response.data,                        HttpHeaderParser.parseCharset(response.headers));                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();                XmlPullParser xmlPullParser = factory.newPullParser();                xmlPullParser.setInput(new StringReader(xmlString));                return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));            } catch (UnsupportedEncodingException e) {                return Response.error(new ParseError(e));            } catch (XmlPullParserException e) {                return Response.error(new ParseError(e));            }        }        @Override        protected void deliverResponse(XmlPullParser response) {            mListener.onResponse(response);        }    }}

其实很简单,Volley提供了非常强的扩展机制,使得我们可以很轻松地定制出任意类型的Request。

XMLRequest也是继承自Request类的,只不过这里指定的泛型类是XmlPullParser,说明我们准备使用Pull解析的方式来解析XML。在parseNetworkResponse()方法中,先是将服务器响应的数据解析成一个字符串,然后设置到XmlPullParser对象中,在deliverResponse()方法中则是将XmlPullParser对象进行回调。

XMLRequest的用法和StringRequest几乎是一模一样的,我们先创建出一个XMLRequest的实例,并把服务器接口地址传入,然后在onResponse()方法中解析响应的XML数据,最后将这个XMLRequest添加到RequestQueue当中。

参考:http://blog.csdn.net/guolin_blog/article/details/17612763

0 0