zoukankan      html  css  js  c++  java
  • android网络框架Retrofit 同步异步

    http://blog.csdn.net/jiguangcanhen/article/details/39006197

    同步的方式:

    1)首先定义要接口。注解Get表示使用的Get请求方式,{user}代表要被替换的数据

    public interface GitHubService {
      @GET("/users/{user}/repos")
      List<Repo> listRepos(@Path("user") String user);
    }

    2)初始化RestAdapter,并利用动态代理来创建的接口对象。

    RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint("https://api.github.com")
        .build();
    GitHubService service = restAdapter.create(GitHubService.class);

    3)使用网络访问并返回

    List<Repo> repos = service.listRepos("octocat");

    异步的方式:

    @POST("/users/new")
    void createUser(@Body User user, Callback<User> cb);

    注:body注解,在进行请求前对象会被转换器进行相应的数据转换。

    前两部和之前的相同,不同在于最后一个参数变成了CallBack对象。

    controller.getLogin(mail, password, new Callback<UserDataModel>() {

                @Override

                public void failure(RetrofitError error) {

                    // TODO Auto-generated method stub

                }

     

                @Override

                public void success(UserDataModel ldm, Response response) {

                    // TODO Auto-generated method stub

            });

    可以看到当请求网络返回之后,会在failure中和success中进行回调,而且默认的数据转换器会把相应的json字符串转换为对象。(当然,我们也可以定义自己的数据转换器)

    定义自己的数据转换器:

    public class MyConverter implements Converter {

        @Override

        public Object fromBody(TypedInput body, Type type) throws ConversionException {

            StringBuffer result = new StringBuffer();

            try {

                InputStream is = body.in();

                byte[] buffer = new byte[1024];

                while(is.read(buffer) != -1){

                    result.append(new String(buffer,"UTF-8"));

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

            return result;

        }

     

        @Override

        public TypedOutput toBody(Objectobject) {

            return null;

        }

    }

    上面的自定义数据转换器,会在请求成功之后,返回给我们字符串,而不是相应的被gson转换过格式的字符串。

    RestAdapter restAdapter = new RestAdapter.Builder()

             .setEndpoint(“url”)

             .setConverter(new MyConverter())

             .build();

    在创建RestAdapter之后创建设置使用自己的数据转换器就可以了。

    我们还可以灵活的进行其他的配置:

    1)设置请求拦截器,会在请求发出前,进行拦截

    RequestInterceptor requestInterceptor = new RequestInterceptor() {
      @Override
      public void intercept(RequestFacade request) {
        request.addHeader("User-Agent", "Retrofit-Sample-App");
      }
    };
     
    RestAdapter restAdapter = new RestAdapter.Builder()
      .setEndpoint("https://api.github.com")
      .setRequestInterceptor(requestInterceptor)
      .build();

    2)设置错误控制器

    class MyErrorHandler implements ErrorHandler {
      @Override public Throwable handleError(RetrofitError cause) {
        Response r = cause.getResponse();
        if (r != null && r.getStatus() == 401) {
          return new UnauthorizedException(cause);
        }
        return cause;
      }
    }
     
    RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint("https://api.github.com")
        .setErrorHandler(new MyErrorHandler())
        .build();

    3)设置log日志。

    RestAdapter restAdapter = new RestAdapter.Builder()
        .setLogLevel(RestAdapter.LogLevel.FULL)
        .setEndpoint("https://api.github.com")
        .build();

    上面只是简单介绍了它的使用,其实它还有很多的功能,Get,Post,Put,Delete,Head……具体请参见官方网址。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Classloader中loadClass()方法和Class.forName()区别
    java.lang.Class解析
    JDK_Proxy_InvocationHandler_动态代理
    spring之Annotation
    annotation之@Autowired、@Inject、@Resource三者区别
    spring之生命周期
    spring之lazy-init
    我是如何在SQLServer中处理每天四亿三千万记录的
    (转)SQL一次性插入大量数据
    SQL SERVER连接池
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5103437.html
Copyright © 2011-2022 走看看