RoboSpice:android异步网络库简单用法

RoboSpice是一个使你建立异步的长时间的运行任务异常轻松的一个网络库,在网络请求,缓存支持,和提供开箱即用的rest请求方面尤为强大

特性如下

  • 支持 SDK版本8以上的版本
  • 异步执行网络请求(后台服务)
  • 支持开箱即用的rest(使用了 Spring Android or Google Http Client or Retrofit).)
  • 你的查询使用POJOs 作为参数,你会获得POJOs的请求结果
  • 可以以 Jackson or Jackson2 or Gson, or Xml,等格式缓存结果
  • 根据他们的生命周期通知活动或者任何上下文网络请求结果
  • 在UI线程中通知活动或者任何上下文
  • 像Android Loaders,而不像AsyncTasks,不存在内存泄露
  • 简单高容错的异常处理模型
  • 稳定高效
  • 支持请求取消,请求设置优先级,请求合并
  • 支持不同web服务的聚集
  • 大量的测试

github地址 https://github.com/stephanenicolas/robospice

下面我们来使用这个库,使用它有几个步骤

  • 使用一个预先设置好的SpiceService 或者自定义一个SpiceService ,这个SpiceService 会提供给所有请求使用。
  • 在Activity使用,这一步每个activity都不能少,你不得不去重复这一步。除非你在你的项目中使用了一个基类Activity,其他Activity继承了该基类
  • 创建一个SpiceRequest 和RequestListener,这两步也是不得不去为每一个请求重复书写代码。
  • 最后需要定义POJO 类来保存请求的结果

在书写代码前,我们先在android studio中新建一个项目,如果你使用的是eclipse,你需要将依赖包一个一个导入。
技术分享

在android studio中,打开app下的buidl.gradle,加入以下依赖

    compile(‘com.octo.android.robospice:robospice-google-http-client:1.4.14‘) {
        exclude(group: ‘org.apache.httpcomponents‘, module: ‘httpclient‘)
    }
    compile(‘com.google.http-client:google-http-client-jackson2:1.19.0‘) {
        exclude(group: ‘xpp3‘, module: ‘xpp3‘)
        exclude(group: ‘org.apache.httpcomponents‘, module: ‘httpclient‘)
        exclude(group: ‘junit‘, module: ‘junit‘)
        exclude(group: ‘com.google.android‘, module: ‘android‘)
    }

然后再android{}中加入以下配置,否则会出现冲突包

 packagingOptions {
        exclude ‘META-INF/LICENSE.txt‘
        exclude ‘META-INF/NOTICE.txt‘
    }

build一下就会将依赖包下载下来。

编写SpiceService

一切就绪后开始编写代码,这里我们使用自定义的SpiceService ,简单重写getThreadCount方法。

package cn.edu.zafu.robospicedemo.service;

/**
 * Created by lizhangqu on 2015/4/15.
 */
import com.octo.android.robospice.Jackson2GoogleHttpClientSpiceService;

public class HttpClientSpiceService extends Jackson2GoogleHttpClientSpiceService {

    @Override
    public int getThreadCount() {
        return 4;
    }

}

在manifest中声明这个service

 <service
      android:name=".service.HttpClientSpiceService"
      android:exported="false" />

编写SpiceRequest

由于所有的请求都要写一个SpiceRequest,所有我们先编写一个基类,其余的SpiceRequest继承它

package cn.edu.zafu.robospicedemo.webservice;

import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpContent;
import com.google.api.client.http.HttpRequest;
import com.octo.android.robospice.request.googlehttpclient.GoogleHttpClientSpiceRequest;

import java.io.IOException;
import java.util.HashMap;

public abstract class BaseGoogleHttpClientSpiceRequest<RESULT> extends GoogleHttpClientSpiceRequest<RESULT> {

    String url = null;
    HashMap<String, String > postParameters;

    protected BaseGoogleHttpClientSpiceRequest(Class<RESULT> clazz) {
        super(clazz);
    }

    public HttpRequest buildGetRequest(GenericUrl url) throws IOException {
        System.setProperty("http.keepAlive", "false");
        HttpRequest request = getHttpRequestFactory().buildGetRequest(url);
        request.getHeaders().setAcceptEncoding("gzip");
        request.getHeaders().set("Connection", "close");
        request.getHeaders().setAccept("text/html,application/xhtml+xml,application/xml,application/json");
        return request;
    }

    public HttpRequest buildPostRequest(GenericUrl url, HttpContent content) throws IOException {
        System.setProperty("http.keepAlive", "false");
        HttpRequest request = getHttpRequestFactory().buildPostRequest(url, content);
        request.getHeaders().setAcceptEncoding("gzip");
        request.getHeaders().set("Connection", "close");
        request.getHeaders().setAccept("text/html,application/xhtml+xml,application/xml,application/json");
        return request;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setPostParameters(HashMap<String, String> postParameters) {
        this.postParameters = postParameters;
    }
}

我们请求服务器上的一个json数据,其格式如下

{"id":1,"name":"zhangsan","age":20,"address":"china"}

我们编写一个PersonRequest

package cn.edu.zafu.robospicedemo.webservice;

import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpContent;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.UrlEncodedContent;
import com.google.api.client.json.jackson2.JacksonFactory;

import cn.edu.zafu.robospicedemo.webservice.json.PersonJson;

/**
 * Created by lizhangqu on 2015/4/15.
 */
public class PersonRequest extends BaseGoogleHttpClientSpiceRequest<PersonJson> {

    public PersonRequest() {
        super(PersonJson.class);
    }

    @Override
    public PersonJson loadDataFromNetwork() throws Exception {

        HttpRequest request = null;
        GenericUrl genericUrl = new GenericUrl(url);

        if (postParameters == null) {
            request = getHttpRequestFactory().buildGetRequest(genericUrl);
        } else {
            HttpContent content = new UrlEncodedContent(postParameters);
            request = buildPostRequest(genericUrl, content);
        }
        request.setParser(new JacksonFactory().createJsonObjectParser());

        return request.execute().parseAs(getResultType());
    }

}

编写POJO

根据json格式编写

package cn.edu.zafu.robospicedemo.webservice.json;

import com.google.api.client.util.Key;

/**
 * Created by lizhangqu on 2015/4/15.
 */
public class PersonJson {
    @Key
    private int id;
    @Key
    private String name;
    @Key
    private int age;
    @Key
    private String address;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }


}

编写监听器

在MainActivity中编写一个函数

 public void requestTestData() {
        PersonRequest request = new PersonRequest();
        request.setUrl("http://121.199.33.93/7plus/index/hello");
        spiceManager.execute(request, new RequestListener<PersonJson>() {
            @Override
            public void onRequestFailure(SpiceException spiceException) {

            }

            @Override
            public void onRequestSuccess(PersonJson personJson) {
                Toast.makeText(getApplicationContext(),personJson.getId()+" "+personJson.getName()+" "+personJson.getAge()+" "+personJson.getAddress(),Toast.LENGTH_LONG).show();
            }
        });
    }

使用RoboSpice

在MainActivity中声明一个变量

  private SpiceManager spiceManager = new SpiceManager(HttpClientSpiceService.class);

重写生命周期

  @Override
    public void onStart() {
        spiceManager.start(this);
        super.onStart();
    }

    @Override
    public void onStop() {
        if (spiceManager.isStarted()) {
            spiceManager.shouldStop();
        }
        super.onStop();
    }

收尾工作

别忘记增加权限,在manifest中增加以下权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

运行

这时候运行一下,如果不出意外将有一个toast显示json数据中的内容

源码下载

基于android studio,下载链接
http://download.csdn.net/detail/sbsujjbcy/8599469

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。