当前位置: 移动技术网 > 移动技术>移动开发>Android > Android的HTTP操作库Volley的基本使用教程

Android的HTTP操作库Volley的基本使用教程

2019年07月24日  | 移动技术网移动技术  | 我要评论

以前原本都用android内建的library来进行get、post等等对api的连线与操作。
但最近想说来找找看有没有好用的library,应该可以事半功倍。
当初有找了三套比较多人用的
1.android asynchronous http client
2.okhttp
square开发并且开源的,因为之前用过他们家的picasso,所以对这套满有好感的,只可惜使用方式不太喜欢
3.volley
volley是google在2013年google i/o的时候发布的,到现在已经积累了很高的人气。
volley的github项目地址:https://github.com/mcxiaoke/android-volley

创建json请求
volley自带了jsonobjectrequest和jsonarrayrequest分别来处理json对象请求和json数据请求(但是voley没有使用gson库写一个gsonrequest,发送一个request,volley直接返回一个java对象,不过我们可以自己写)。
创建json object请求。
发送一个请求只要这么简单,创建一个jsonrequest对象,写好response回调接口,并把这个请求放到请求队列中就可以了。jsonarrayrequest也类似。

// tag used to cancel the request
string tag_json_obj = "json_obj_req";
string url = "http://api.androidhive.info/volley/person_object.json";

jsonobjectrequest jsonobjreq = new jsonobjectrequest(method.get,url, null,
      new response.listener<jsonobject>() {

        @override
        public void onresponse(jsonobject response) {
          log.d(tag, response.tostring());
        }
      }, new response.errorlistener() {

        @override
        public void onerrorresponse(volleyerror error) {
          volleylog.d(tag, "error: " + error.getmessage());
        }
      });

// adding request to request queue
appcontroller.getinstance().addtorequestqueue(jsonobjreq, tag_json_obj);

创建string请求
stringrequest可以用来请求任何string类型的数据:json,xml,文本等等。

// tag used to cancel the request
string tag_string_req = "string_req";

string url = "http://api.androidhive.info/volley/string_response.html";

progressdialog pdialog = new progressdialog(this);
pdialog.setmessage("loading...");
pdialog.show();   

stringrequest strreq = new stringrequest(method.get,
      url, new response.listener<string>() {

        @override
        public void onresponse(string response) {
          log.d(tag, response.tostring());
          pdialog.hide();

        }
      }, new response.errorlistener() {

        @override
        public void onerrorresponse(volleyerror error) {
          volleylog.d(tag, "error: " + error.getmessage());
          pdialog.hide();
        }
      });

// adding request to request queue
appcontroller.getinstance().addtorequestqueue(strreq, tag_string_req);

创建post请求
上面说的都是get请求,下面来说一下post请求,与get请求不同的是,只要在创建请求的时候将请求类型改为post请求,并且override request的getparams方法即可。

// tag used to cancel the request
string tag_json_obj = "json_obj_req";

string url = "http://api.androidhive.info/volley/person_object.json";
progressdialog pdialog = new progressdialog(this);
pdialog.setmessage("loading...");
pdialog.show();   

  jsonobjectrequest jsonobjreq = new jsonobjectrequest(method.post,
      url, null,
      new response.listener<jsonobject>() {

        @override
        public void onresponse(jsonobject response) {
          log.d(tag, response.tostring());
          pdialog.hide();
        }
      }, new response.errorlistener() {

        @override
        public void onerrorresponse(volleyerror error) {
          volleylog.d(tag, "error: " + error.getmessage());
          pdialog.hide();
        }
      }) {

    @override
    protected map<string, string> getparams() {
      map<string, string> params = new hashmap<string, string>();
      params.put("name", "androidhive");
      params.put("email", "abc@androidhive.info");
      params.put("password", "password123");

      return params;
    }

  };

// adding request to request queue
appcontroller.getinstance().addtorequestqueue(jsonobjreq, tag_json_obj);

添加请求头部信息

// tag used to cancel the request
string tag_json_obj = "json_obj_req";

string url = "http://api.androidhive.info/volley/person_object.json";

progressdialog pdialog = new progressdialog(this);
pdialog.setmessage("loading...");
pdialog.show();   

jsonobjectrequest jsonobjreq = new jsonobjectrequest(method.post,url, null,new response.listener<jsonobject>() {
  @override
  public void onresponse(jsonobject response) {
    log.d(tag, response.tostring());
    pdialog.hide();
  }
}, new response.errorlistener() {
  @override
  public void onerrorresponse(volleyerror error) {
    volleylog.d(tag, "error: " + error.getmessage());
    pdialog.hide();
  }
}) {

/**
* passing some request headers
* */
@override
public map<string, string> getheaders() throws authfailureerror {
  hashmap<string, string> headers = new hashmap<string, string>();
  headers.put("content-type", "application/json");
  headers.put("apikey", "xxxxxxxxxxxxxxx");
  return headers;
}
};
// adding request to request queue
appcontroller.getinstance().addtorequestqueue(jsonobjreq, tag_json_obj);

创建image请求
volley库中自带了networkimageview类,这个imageview可以自动使用volley下载图片
1.用networkimageview加载图片
首先,说明一下,加载图片的原理:
networkimageview加载图片需要一个imageloader和一个图片url,这个imageloader对象需要一个请求队列对象和imagecahe对象。调用networkimageview的seturl方法后,首先会判断当前imageview的url和新传入的url是否一致,如果相同,就不用再发送http请求了,如果不同,那么就使用imageloader对象来发送http请求获取图片。

imageloader imageloader = appcontroller.getinstance().getimageloader();
// if you are using networkimageview
imgnetworkview.setimageurl(const.url_image, imageloader);

加载一个图片只要这么简单~~~
2.用imageview来加载图片
这个过程和networkimageview类似

imageloader imageloader = appcontroller.getinstance().getimageloader();

// if you are using normal imageview
imageloader.get(const.url_image, new imagelistener() {

  @override
  public void onerrorresponse(volleyerror error) {
    log.e(tag, "image load error: " + error.getmessage());
  }

  @override
  public void onresponse(imagecontainer response, boolean arg1) {
    if (response.getbitmap() != null) {
      // load image into imageview
      imageview.setimagebitmap(response.getbitmap());
    }
  }
});

可以再简单一点:

// loading image with placeholder and error image
imageloader.get(const.url_image, imageloader.getimagelistener(imageview, r.drawable.ico_loading, r.drawable.ico_error));


imageloader.getimagelistener方法中已经写了一个默认的imagelistener了
volley cache
volley中自带了强大的cache机制来管理请求cache,这会减少网络请求次数和用户等待时间。
从请求cache中加载请求:

cache cache = appcontroller.getinstance().getrequestqueue().getcache();
entry entry = cache.get(url);
if(entry != null){
  try {
    string data = new string(entry.data, "utf-8");
    // handle data, like converting it to xml, json, bitmap etc.,
  } catch (unsupportedencodingexception e) {   
    e.printstacktrace();
    }
  }
}else{
  // cached response doesn't exists. make network call here
}

使请求缓存失效
失效并不意味这删除,volley还会继续使用缓存的对象直到从服务器上获取到了新的数据,新的数据会覆盖旧的数据。

appcontroller.getinstance().getrequestqueue().getcache().invalidate(url, true);

关闭cache
如果你想将某一个请求的cache功能关闭,直接调用request的setshouldcache()方法就可以:

// string request
stringrequest stringreq = new stringrequest(....);

// disable cache
stringreq.setshouldcache(false);

将某一url的cache删除
调用cache的remove方法可以删除这个url的cache:

appcontroller.getinstance().getrequestqueue().getcache().remove(url);

删除所有的cache

appcontroller.getinstance().getrequestqueue().getcache().clear();

取消请求
在你添加一个请求到请求队列中的时候,你可以发现,addtorequestqueue(request, tag)方法还接受一个tag参数,这个tag就是用来标记某一类请求的,这样就可以取消这个tag的所有请求了:

string tag_json_arry = "json_req";
applicationcontroller.getinstance().getrequestqueue().cancelall("feed_request");

请求优先级
在创建一个request的时候可以override request方法的getpriority方法返回一个优先级,优先级分为:normal, low, immediate, high。

private priority priority = priority.high;

stringrequest strreq = new stringrequest(method.get,
      const.url_string_req, new response.listener<string>() {

        @override
        public void onresponse(string response) {
          log.d(tag, response.tostring());
          msgresponse.settext(response.tostring());
          hideprogressdialog();

        }
      }, new response.errorlistener() {

        @override
        public void onerrorresponse(volleyerror error) {
          volleylog.d(tag, "error: " + error.getmessage());
          hideprogressdialog();
        }
      }) {
    @override
    public priority getpriority() {
      return priority;
    }

  };

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网