因为现在的项目中一直是使用soap访问webservice,感觉没有直接post请求爽,所以研究了post访问webservice,之后有研究了volley框架,所以记下来。
activity里声明 private RequestQueue mRequestQueue=Volley.newRequestQueue(this);
1、stringRequest请求,返回值是String类型,感觉这一个基本就能实现一般的post请求了,因为我们自己知道返回值是JSONObject或者JSONArray的,拿到String返回值后自己转换就行了。
public void stringRequest(String url){
StringRequest sq=new StringRequest(Request.Method.POST,url,new Response.Listener<String>(){
@Override
public void onResponse(String response) {
Log.i("response", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
}
}){
//这个地方是post时,参数设置的地方
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> map=new HashMap<String,String>();
map.put("id","45");
return map;
}
};
mRequestQueue.add(sq);
}
2、JsonObjectRequest请求,返回值JsonObject。
/**
* JsonObjectRequest
* @param url
*/
public void jsonObjectRequest(String url){
//第三个参数为JSONObject jsonRequest
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.POST,url,null,new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
info.setText(response.getString("human_account"));
pr.setVisibility(View.INVISIBLE);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
mRequestQueue.add(jr);
}
3、jsonArrayRequest请求,返回值jsonArray。
public void jsonArrayRequest(String url){
JsonArrayRequest jr = new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray arg0) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
}
});
mRequestQueue.add(jr);
}
4、NetworkImageView,这是volley提供的网络图片加载控件
在工具类里面写如下代码:
public static void setImageURL(Context context,String url,NetworkImageView image){
mRequestQueue= Volley.newRequestQueue(context);
LruImageCache lruImageCache = LruImageCache.instance();
//ImageLoader是volley自己的类
ImageLoader imageLoader = new ImageLoader(mRequestQueue,lruImageCache);
//设置默认图片
image.setDefaultImageResId(R.drawable.ic_launcher);
//设置加载出错时显示的图片
image.setErrorImageResId(R.drawable.ic_launcher);
//url是网络地址
image.setImageUrl(url,imageLoader);
}
然后LruImageCache需要自己写,LRU是Least Recently Used 近期最少使用算法:
public class LruImageCache implements ImageCache{
private static LruCache<String, Bitmap> mMemoryCache;
private static LruImageCache lruImageCache;
private LruImageCache(){
// Get the Max available memory
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap bitmap){
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
public static LruImageCache instance(){
if(lruImageCache == null){
lruImageCache = new LruImageCache();
}
return lruImageCache;
}
@Override
public Bitmap getBitmap(String arg0) {
return mMemoryCache.get(arg0);
}
@Override
public void putBitmap(String arg0, Bitmap arg1) {
if(getBitmap(arg0) == null){
mMemoryCache.put(arg0, arg1);
}
}
}
5、activity结束时,取消未完成的网络请求,重写onStop方法
@Override
protected void onStop() {
//有针对的取消操作
//...不会写
//取消全部未完成的请求
mRequestQueue.cancelAll(this);
super.onStop();
}