欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-29 19:49:52
以前原本都用android内建的library来进行get、post等等对api的连线与操作。 但最近想说来找找看有没有好用的library,应该可以事半功倍。 当初有...

以前原本都用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;
    }

  };