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……具体请参见官方网址。

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

  • 相关阅读:
    《挑战30天C++入门极限》新手入门:关于C++中的内联函数(inline)
    《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)
    《挑战30天C++入门极限》新手入门:C++中布尔类型
    《挑战30天C++入门极限》新手入门:C++下的引用类型
    《挑战30天C++入门极限》新手入门:C/C++中数组和指针类型的关系

    《挑战30天C++入门极限》入门教程:C++中的const限定修饰符
    《挑战30天C++入门极限》c++中指针学习的两个绝好例子
    《挑战30天C++入门极限》在c/c++中利用数组名作为函数参数传递排序和用指针进行排序的例子。
    《挑战30天C++入门极限》引言
  • 原文地址:https://www.cnblogs.com/wanqieddy/p/4933606.html
Copyright © 2011-2022 走看看