volley请求用于小数据的请求速度是特别快的,比其他的请求框架简单而实用。
对于初学者来说 是一款 简单易懂 封装好的 网络请求框架。
使用前需要导入 volley jar 包,下载地址:http://www.kwstu.com/ResourcesView/kwstu_201441183330928
首先 在Application 中 定义 以下的代码
在Appliction中 定义了请求队列
public class MyApplication extends Application{
public static RequestQueue queues;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
queues = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueues(){
return queues;
}
}
接下来我 用了官网里面 封装好的 StringRequest 类重写了 一遍
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xmlpull.v1.XmlPullParserException;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
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;
/**
- @date 2013/8/3
- post请求参数
- @author Administrator
*/
public class StringRequests extends Request<String>{
private Map<String,String> params;
private Listener<String> mListener;
/**
* Creates a new request with the given method.
*
* @param method the request {@link Method} to use
* @param url URL to fetch the string at
* @param listener Listener to receive the String response
* @param errorListener Error listener, or null to ignore errors
*/
public StringRequests(String url,Listener<String> listner,ErrorListener errorLister,
Map<String,String> map) {
super(Request.Method.POST, url, errorLister);
// TODO Auto-generated constructor stub
mListener = listner;
params = map;
}
@Override
protected Map<String,String> getParams() throws AuthFailureError{
return params;
}
@Override
protected void deliverResponse(String response) {
// TODO Auto-generated method stub
mListener.onResponse(response);
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
// TODO Auto-generated method stub
String datas;
try{
datas = new String(response.data,HttpHeaderParser.parseCharset(response.headers));
try {
datas = XmlOrJson(datas); //去掉xml的
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//return Response.success(new String(datas),HttpHeaderParser.parseCacheHeaders(response));
}catch(UnsupportedEncodingException ex){
datas = new String(response.data);
}
return Response.success(datas,HttpHeaderParser.parseCacheHeaders(response));
}
/**
* 去掉xml头部
* 处理解析出来的json
* 如果不是json数据格式的就这样的取法
* @param xmlStr
* @return
* @throws XmlPullParserException
*/
public static String XmlOrJson(String xmlStr) throws XmlPullParserException {
// TODO Auto-generated method stub
InputStream inputStream = null;
// 首先找到xml文件
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
// 找到xml,并加载文档
DocumentBuilder builder = factory.newDocumentBuilder();
inputStream = new ByteArrayInputStream(xmlStr.getBytes("UTF-8"));
Document document = builder.parse(inputStream);
// 找到根Element
Element root = document.getDocumentElement();
String nodeValue2 = root.getFirstChild().getNodeValue();
System.out.println("nodeValue2:" + nodeValue2);
return nodeValue2;
} catch (Exception e) {
e.printStackTrace();
return "0";
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
其它请求方式可以按StringReqest 这种方式去模仿的写
程序中调用也很简单我封装是 post 请求数据 如下:
private void loadStringData(){
String url = "http://*******";
Map<String,String> params = new HashMap<String,String>();
params.put("", "");
params.put("", "");
params.put("", "200");
params.put("", "*");
Request<String> request = new StringRequests(url, new Listener<String>() {
@Override
public void onResponse(String response) {
// TODO Auto-generated method stub
//mytet.setText(response);
if(!response.equals("")&&!response.equals(null)){
//getGsonData(response);
//使用到这里 只要把数据取出来就可以随心所欲的去用GSON 解析数据或者使用JSONObject。
Log.i("取出来的数据",response);
}
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
Log.i("========error======", error+"");
}
},params);
//修改默认超时时间
request.setRetryPolicy(new DefaultRetryPolicy(5000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
request.setTag("你想要的名字"); //设置别名
MyApplication.getHttpQueues().add(request); //添加到队列里面
}
到此数据请求出来就可以使用了。