Volley的使用

以下是在我的項目中,Volley的使用,自己的經驗、用法的總結以及記錄:
1、Volley請求服務器返回JsonObject:

RequestQueue  mQueue = Volley.newRequestQueue(this);
    JsonObjectRequest json = new JsonObjectRequest(del, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject jsonObject) {
            try {
                delstatus = jsonObject.getString("status");
                delinfo = jsonObject.getString("info");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            if ("true".equals(delstatus)) {
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
        }
    });
    mQueue.add(json);
}

2、Volley請求服務器返回JsonArray:

private void GetArray(){
    RequestQueue queue = Volley.newRequestQueue(this);
    String str = "";   //請求服務器的網址
    JsonArrayRequest json = new JsonArrayRequest(str, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray jsonArray) {
            for (int i = 0; i <jsonArray.length() ; i++) {
                try {
                    JSONObject item = jsonArray.getJSONObject(i);
                    String name = item.getString("name");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
        }
    });
    queue.add(json);
}

3、Volley Post數據到服務器,Post的數據放入到Map中,返回一個JsonObject:
首先,重寫Request:

/**
 * 重寫volley的Post請求,可Post Map,返回一個JsonObject
 */

public class JsonObjectPostRequest extends Request<JSONObject> {

    private Map<String,String> mMap;
    private Response.Listener<JSONObject> mListener;


    public JsonObjectPostRequest(String url,Response.Listener<JSONObject> listener, Response.ErrorListener errorListener,Map map) {
        super(Request.Method.POST, url, errorListener);
        mListener=listener;
        mMap=map;

    }
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {

        return mMap;
    }

    @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 response) {
        mListener.onResponse(response);

    }

調用:

/**
* 登錄驗證
* */
private void  checklogin(){

    RequestQueue mqueue = Volley.newRequestQueue(this);
    final Map<String,String> map = new HashMap<>();
    map.put("user",username);
    map.put("pwd",userpassword);
    JsonObjectPostRequest jsonpost = new JsonObjectPostRequest(Baseurl.Post_login, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject jsonObject) {
            try {
                status = jsonObject.getString("status");
                item = jsonObject.getJSONObject("results");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            if ("true".equals(status)) {
                intent.setClass(context, MainActivity.class);
                startActivity(intent);
                finish();
                ToastUtil.showToast(context, "登陸成功");
                DialogUtil.closedialog();
            }else {
                ToastUtil.showToast(context, "用戶名或密碼錯誤");
                DialogUtil.closedialog();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
        }
    },map);
    mqueue.add(jsonpost);
}

4、Volley Post數據到服務器,Post的數據放入到Map中,返回一個JsonArray:
首先,重寫Request(調用方法跟返回JsonObject的一樣):

/**
 * 重寫volley的Post請求,可Post Map,返回一個JsonArray
 */
public class JsonArrayPostRequest extends Request<JSONArray>{

    private Map<String,String> mMap;
    private Response.Listener<JSONArray> mListener;
    private LruCache lrucache;


    public JsonArrayPostRequest(String url,Response.Listener<JSONArray> listener, Response.ErrorListener errorListener,Map map) {
        super(Request.Method.POST, url, errorListener);
        mListener=listener;
        mMap=map;
    }
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return mMap;
    }

    @Override
    protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString =
                    new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONArray(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(JSONArray response) {
        mListener.onResponse(response);

    }
}

5、Volley加載圖片到listview中,Volley加載圖片又幾種方式,這裏用NetworkImageView,首先佈局裏面的Imageview應該引用NetworkImageView,
然後在Adapter裏面:

public class VolleyListAdapter extends BaseAdapter {
   private RequestQueue mQueue;
   private ImageLoader mImageLoader;
   private LayoutInflater mInflater;
   private List<BaseBeams> items;

   public VolleyListAdapter(Context context,  List<BaseBeams> itemList) {
      super();
      mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      this.items = itemList;
      mQueue = Volley.newRequestQueue(context);
      mImageLoader = new ImageLoader(mQueue, new BitmapCache());
   }

   @Override
   public int getCount() {
      return items.size();
   }

   @Override
   public Object getItem(int position) {
      return items.get(position);
   }

   @Override
   public long getItemId(int position) {
      return items.get(position).getId();
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
      ViewHolder holder;
      if (convertView == null) {
         convertView = mInflater.inflate(R.layout.image_item_one, null);
         holder = new ViewHolder();
         holder.imageView = (NetworkImageView) convertView.findViewById(R.id.imageView);
         holder.textView1 = (TextView) convertView.findViewById(R.id.textView1);
         holder.textView2 = (TextView) convertView.findViewById(R.id.textView2);
         convertView.setTag(holder);
      }else {
         holder = (ViewHolder) convertView.getTag();
      }
      BaseBeams item = items.get(position);
      holder.textView1.setText(item.getTitle());
      holder.textView2.setText(item.getInfo());
      /**
       * Volley加載圖片,避免了圖片錯位
       * */
      final String imgurl = item.getImgUrl();
      if (imgurl != null && !imgurl.equals("")) {
         holder.imageView.setDefaultImageResId(R.mipmap.download);       //加載中的圖片
         holder.imageView.setErrorImageResId(R.mipmap.erro_download);    //加載失敗的圖片
         holder.imageView.setImageUrl(item.getImgUrl(), mImageLoader);   //加載完成的圖片
         holder.imageView.setScaleType(ImageView.ScaleType.FIT_XY);
      }
      return convertView;
   }

   private static class ViewHolder {
      private NetworkImageView imageView;
      private TextView textView1, textView2;
   }

}

然後在activity中引用:

/*
* 獲取listview的信息
* */

private void GetList(){

    path = "";
    JsonObjectRequest json = new JsonObjectRequest(path, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject jsonObject) {
            try {
                status = jsonObject.getString("status");
                info1 = jsonObject.getString("info");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            if ("true".equals(status)) {
                try {
                    jsonArray = jsonObject.getJSONArray("results");
                    for (int i = 0; i < jsonArray.length(); i++) {
                        item = jsonArray.getJSONObject(i);
                        title = item.getString("title");
                        info = item.getString("info");
                        imageurl = item.getString("img");
                        myid = item.getInt("id");

                        baseBeams = new BaseBeams();
                        baseBeams.setTitle(title);
                        baseBeams.setInfo(info);
                        baseBeams.setHint(myid + "");
                        baseBeams.setImgUrl(imageurl);
                        baseBeams.setNull(mcheck);
                        list.add(baseBeams);
                    }              
                 mAdapter = new VolleyListAdapter(context,list);
                 main_user_collect_listview.setAdapter(mAdapter);
                 mAdapter.notifyDataSetChanged();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } 
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
        }
    });
    mQueue.add(json);
}
public class BitmapCache implements ImageCache {
   private LruCache<String, Bitmap> mCache;

   public BitmapCache() {
      if (mCache == null) {
         int maxSize = 10 * 1024 * 1024;
         mCache = new LruCache<String, Bitmap>(maxSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
               return bitmap.getByteCount();
            }
         };
      }
   }

   @Override
   public Bitmap getBitmap(String url) {
      return mCache.get(url);
   }

   @Override
   public void putBitmap(String url, Bitmap bitmap) {
      if (bitmap != null) {
         mCache.put(url, bitmap);
      }
   }
}
發佈了61 篇原創文章 · 獲贊 72 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章