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……具體請參見官方網址。

版權聲明:本文為博主原創文章,未經博主允許不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM