目錄:andorid jar/庫源碼解析 Retrofit2: 作用: 通過封裝okhttp庫,來進行web通訊,並且使用動態代理的方式,來調用介面地址,通過回調賦值結果。 慄子: 定義一個介面,用於訪問使用。 public interface IServiceApi { @FormUrlEncod ...
Retrofit2:
作用:
通過封裝okhttp庫,來進行web通訊,並且使用動態代理的方式,來調用介面地址,通過回調賦值結果。
慄子:
定義一個介面,用於訪問使用。
public interface IServiceApi { @FormUrlEncoded @POST("login") Call<LoginResult> login(@Field("name") String name, @Field("pwd") String pwd); @GET("getinfo") Call<UserInfo> getinfo(@Query("token") String token); @GET("getinfo2") Call<UserInfo> getinfo2(@Query("token") String token); }
調用介面1.可以在main中調用,因為是通過非同步執行(enqueue)
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl("http://192.168.86.11:8087/").build(); IServiceApi api = retrofit.create(IServiceApi.class); Call<LoginResult> call = api.login("test", "test1234"); call.enqueue(new Callback<LoginResult>() { @Override public void onResponse(Call<LoginResult> call, Response<LoginResult> response) { LoginResult loginResult = response.body(); if(loginResult != null) { } } @Override public void onFailure(Call<LoginResult> call, Throwable t) { Log.i(tag, "ex " + t.getMessage()); } });
調用介面2.可以在main中調用,因為是通過非同步執行(enqueue)
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl("http://192.168.86.11:8087/").build(); IServiceApi api = retrofit.create(IServiceApi.class); Call<UserInfo> call = api.getinfo("testtesttest"); call.enqueue(new Callback<UserInfo>() { @Override public void onResponse(Call<UserInfo> call, Response<UserInfo> response) { UserInfo userInfo = response.body(); if(userInfo != null) { } } @Override public void onFailure(Call<UserInfo> call, Throwable t) { Log.i(tag, "ex " + t.getMessage()); } });
同步調用介面3.
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl("http://192.168.86.11:8087/").build(); IServiceApi api = retrofit.create(IServiceApi.class); Call<LoginResult> call = api.login("test", "test1234"); try { Response<LoginResult> resultResponse = call.execute(); LoginResult result = resultResponse.body(); }catch (Exception e){ e.printStackTrace(); }
源碼解讀:
A:非同步調用
1、創建一個Retrofit對象。
2、retrofit.create(IServiceApi.class); // 使用Proxy.newProxyInstance 創建一個介面的代理對象。內部使用 ServiceMethod配合OkHttpCall調用,構造他們需要的對象數據
3、調用enqueue,內部構造okhttp3.Call對象,執行對象的enqueue方法。然後在okhttp3$Callback方法中,調用retrofit2的 回調,賦值成功和失敗。
B:同步調用
1、同理,同步調用,最後也是調用的。okhtt3.Call的execute方法。
源碼:https://github.com/square/retrofit
引入:
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'