学习开发文档Making a Standard Request。
Volley本身有四个Request:JsonObjectRequest、JsonArrayRequest、StringRequest和ImageRequest。
这篇笔记结合自己写的一个照片墙来分析怎么使用Request.
MainActivity的布局文件就是简单的一个GridView.
MainActivity的主要代码。
private void initData() {
urls = new ArrayList<String>();
VolleyLog.DEBUG = true;
requestQueue = Volley.newRequestQueue(this);
jar = new JsonArrayRequest("http://192.168.2.107:8080/img.html",new Response.Listener<JSONArray>(){
@Override
public void onResponse(JSONArray jsonArray) {
JSONObject jo;
urls.clear();
for (int i = 0; i< jsonArray.length();i++){
try {
jo = jsonArray.getJSONObject(i);
Log.i("Volley",jo.optString("img_url"));
urls.add(jo.optString("img_url"));
} catch (JSONException e) {
e.printStackTrace();
Log.i("Volley",e.getMessage());
}
}
setAdapter();
}
},new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i("Volley",volleyError.getMessage());
}
});
}
首先,使用JsonArrayRequest来获取照片资源的网址,将这些网址添加到urls集合中。然后,设置Adapter.下面是ImageAdapter的源码。
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private List<String> urls;
private RequestQueue rq;
public ImageAdapter(Context mContext,List<String> urls,RequestQueue rq){
this.mContext = mContext;
this.urls = urls;
this.rq = rq;
}
@Override
public int getCount() {
return urls.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
ImageRequest ir;
if (convertView != null) {
view = convertView;
holder = (ViewHolder) view.getTag();
}else {
view = View.inflate(mContext, R.layout.grid_cell, null);
holder = new ViewHolder();
holder.cell = (ImageView) view.findViewById(R.id.iv_cell);
view.setTag(holder);
}
ir = createImageRequest(position,holder.cell);
if(holder.cell.getTag() != null){
String s1 = (String) holder.cell.getTag();
String s2 = ir.getUrl();
if(!s1.equals(s2)){
ir.cancel();
}
}
holder.cell.setTag(ir.getUrl());
rq.add(ir);
return view;
}
private ImageRequest createImageRequest(int position, final ImageView cell) {
return new ImageRequest(urls.get(position),new Response.Listener<Bitmap>(){
@Override
public void onResponse(Bitmap bitmap) {
cell.setImageBitmap(bitmap);
}
},100,100,Bitmap.Config.ARGB_8888,new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError volleyError) {
cell.setImageResource(R.mipmap.ic_launcher);
}
});
}
class ViewHolder{
ImageView cell;
}
}
其中用来防止乱序的代码是:
if(holder.cell.getTag() != null){
String s1 = (String) holder.cell.getTag();
String s2 = ir.getUrl();
if(!s1.equals(s2)){
ir.cancel();
}
}
holder.cell.setTag(ir.getUrl());
下面是效果图