一般的客户端都有向服务端请求数据的功能。
Android的app也是如此,于是我们借助了volley这个框架实现数据量较小,处理快的的get()和post()请求。
1.将volley包导入到Android Studio中,一般将包放在app目录下的libs目录里。
2.编写layout布局。这里我就直接上代码吧。
<Button
android:onClick="OOKK"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定"
android:id="@+id/button"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="107dp" />
<Button
android:onClick="WriteClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写数据"
android:id="@+id/button2"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="116dp" />
3.在AndroidMain.xml添加网络访问权限
<!--加入网络权限-->
<uses-permission android:name="android.permission.INTERNET"/>
4.定义一个Java类,用来控制全局的请求队列
/**
*创建一个全局的请求队列
* Created by poulwalker on 2016/9/17.
*/
public class MyApp extends Application{
public static RequestQueue queues;
@Override
public void onCreate() {
super.onCreate();
queues= Volley.newRequestQueue(getApplicationContext());//实例化请求队列,参数是app的上下文
}
}
/*
* 写一个方法,用来获取请求队列
*
* */
public static RequestQueue getHttpQueues(){
return queues;
}
5.get()请求普通类型的数据
/*
* new StringRequest(int method,String url,Listener listener,ErrorListener errorListener)
* method:请求方式,Get请求为Method.GET,Post请求为Method.POST
* url:请求地址
* listener:请求成功后的回调
* errorListener:请求失败的回调
*/
private void volley_StringRequestGet() {
/*
* 创建stringRequest这个请求对象,请求我们的数据接口
* */
/*
* 第一个参数是请求方式,2,请求的接口地址,3.请求成功的回调,4.请求失败的回调
* */
String url="http://xxx.xxx.xxx/xxx";//地址栏
StringRequest request=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(WebActivity.this,s.toString(),Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(WebActivity.this,"aaaa",Toast.LENGTH_LONG).show();;
}
});
/*
* 创立tag标签,方便寻找
* */
request.setTag("volleyStringRequestGet");
/*
* 将request添加到全局变量里面
* */
MyApp.getHttpQueues().add(request);
}
这里要注意的是由于get()是无参数请求的,因此要带参数请求数据时,就必须将参数放在url地址里。
get()请求jsonobject的数据
/*
* 第三个参数为请求参数
* 请求Json数据
* */
/**
* new JsonObjectRequest(int method,String url,JsonObject jsonObject,Listener listener,ErrorListener errorListener)
* method:请求方式,Get请求为Method.GET,Post请求为Method.POST
* url:请求地址
* JsonObject:Json格式的请求参数。如果使用的是Get请求方式,请求参数已经包含在url中,所以可以将此参数置为null
* listener:请求成功后的回调
* errorListener:请求失败的回调
*/
private void volley_JsonObjectRequestGet(){
String url="http://xxx.xxx.xxx/xxx/xxx";
JsonObjectRequest request=new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(WebActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(WebActivity.this,"aaaa",Toast.LENGTH_LONG).show();;
}
});
/*
* 创立tag标签,方便寻找,可以在全局请求队列中通过Tag标签进行请求的查找
* */
request.setTag("volleyJsonObjectRequestGet");
/*
* 将request添加到全局队列里面
* */
MyApp.getHttpQueues().add(request);
}
get()请求JsonArray数组数据
/*
* 请求json数组
* JsonArrayRequest只有get请求,可以在url后面加上参数
* */
private void volley_JsonArraryRequestGet(){
String url="http://xxx.xxxx.xxx/xxx";
JsonArrayRequest request=new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray jsonArray) {
Toast.makeText(WebActivity.this,jsonArray.toString(),Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(WebActivity.this,"error"+volleyError.toString(),Toast.LENGTH_LONG).show();
}
});
/*
* 创立tag标签,方便寻找
* */
request.setTag("volleyJsonArraryRequestGet()");
/*
* 将request添加到全局变量里面
* */
MyApp.getHttpQueues().add(request);
}
6.post请求
普通类型的post请求
/*
* post传递参数不能写在url里面,在getParams里面写传递参数
* */
private void volley_StringRequestPost(){
String url="http://xxx.xxx.xxx/xxx";
StringRequest request=new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(WebActivity.this,s.toString(),Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(WebActivity.this,"aaaa",Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> hashMap=new HashMap<>();
hashMap.put("cno","1234");//第一个为key,第二个为值
hashMap.put("name","qwe");
hashMap.put("time","100");
return hashMap;
}
};
request.setTag("volleyStringRequestPost");
MyApp.getHttpQueues().add(request);
}
以json方式请求数据,返回的是json格式
//以json方式请求数据,返回的是json格式
private void volley_JsonObjectRequestPost(){
String url="http://xxx.xxx.xxx/xxx";
Map<String,String> map=new HashMap<>();
map.put("cno","12345677");
JSONObject object=new JSONObject(map);
//将map转化为JSONObject对象
JsonObjectRequest objectRequest=new JsonObjectRequest(Request.Method.POST, url,object, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(WebActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(WebActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
}
});
objectRequest.setTag("volleyJsonObjectRequestPost");
MyApp.getHttpQueues().add(objectRequest);
}
以普通方式请求数据,返回的是json格式
我们需要定义一个类,用来复写volley方法。
public class NormalPostRequest extends Request{
private Map<String, String> mMap;
private Response.Listener<JSONObject> mListener;
public NormalPostRequest(String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener, Map<String, String> map) {
super(Method.POST, url, errorListener);
mListener = listener;
mMap = map;
}
//mMap是已经按照前面的方式,设置了参数的实例
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return mMap;
}
//此处因为response返回值需要json数据,和JsonObjectRequest类一样即可
@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));
}
}
@Override
protected void deliverResponse(JSONObject jsonObject) {
mListener.onResponse(jsonObject);
}
}
接着在主活动里以普通方式请求数据。
//以普通方式请求数据,返回的是json格式
private void volley_NormallJsonObjectRequestPost(){
String url="http://xxx.xxx.xxx/xxx";
Map<String,String> map=new HashMap<>();
map.put("cno","1234");
Request<JSONObject> request=new NormalPostRequest(url, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
//Log.d("TAG",jsonObject.toString());
//Toast.makeText(WebActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
javaBean=GsonImpl.get().toObject(jsonObject.toString(),JavaBean.class);
//javaBean=GsonImpl.get().toList(jsonObject.toString(),new TypeToken<List<JavaBean.DataBean.DataJBean.getName()>>(){}.getType());
String n=javaBean.getStatus()+javaBean.getData().getCode()+"";
String name=javaBean.getData().getData().get(0).getSex().toString();
Toast.makeText(WebActivity.this,n,Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(WebActivity.this,"AAA",Toast.LENGTH_LONG).show();
}
},null);
request.setTag("volleyNormallJsonObjectRequestPost");
MyApp.getHttpQueues().add(request);
}
基本上volley框架已经讲完了。当然,还能用volley框架请求图片,缓存图片,上传文件等。下期我们讲如何利用Gson工具类来解析json数据。得到我们所要的结果。