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);
}