亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

android Retrofit2+okHttp3使用總結(jié)

 更新時(shí)間:2017年04月01日 10:16:14   作者:林水吉  
本篇文章主要介紹了android Retrofit2+okHttp3使用總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

使用前準(zhǔn)備

Build.gradle文件配置

dependencies配置

compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'

網(wǎng)絡(luò)框架搭建

服務(wù)創(chuàng)建類封裝(HTTP):

public class ServiceGenerator {
 public static final String API_BASE_URL = "";
 public static int READ_TIMEOUT = 60;
 public static int WRIT_TIMEOUT = 60;
 public static int CONNECT_TIMEOUT = 60;
 private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder()
   .readTimeout(READ_TIMEOUT,TimeUnit.SECONDS)//設(shè)置讀取超時(shí)時(shí)間
   .writeTimeout(WRIT_TIMEOUT,TimeUnit.SECONDS)//設(shè)置寫的超時(shí)時(shí)間
   .connectTimeout(CONNECT_TIMEOUT,TimeUnit.SECONDS);

 private static Retrofit.Builder builder =
   new Retrofit.Builder()
     .baseUrl(API_BASE_URL)     .addConverterFactory(GsonConverterFactory.create());

 public static <S> S createService(Class<S> serviceClass) {
  return createService(serviceClass, null);
 }

 public static <S> S createService(Class<S> serviceClass, final String authToken) {
  if (authToken != null) {
   httpClient.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
     Request original = chain.request();

     // Request customization: add request headers
     Request.Builder requestBuilder = original.newBuilder()
       .method(original.method(), original.body());

     Request request = requestBuilder.build();
     return chain.proceed(request);
    }
   });
  }

  OkHttpClient client = httpClient
    // 日志攔截器
    .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
    .build();
  Retrofit retrofit = builder.client(client).build();
  return retrofit.create(serviceClass);
 }
}

使用說(shuō)明:

API_BASE_URL 用來(lái)配置api主地址

READ_TIMEOUT 用來(lái)配置讀取超時(shí)時(shí)間

WRIT_TIMEOUT 用來(lái)配置寫超時(shí)時(shí)間

CONNECT_TIMEOUT 用來(lái)配置連接超時(shí)時(shí)間

addConverterFactory() 用來(lái)設(shè)置解析器,此處我們?cè)O(shè)置的是gson的解析

addInterceptor() 用來(lái)設(shè)置日志攔截器

服務(wù)創(chuàng)建類封裝(HTTPS):

 public class HttpsServiceGenerator {
 public static final String API_BASE_URL = "";
 public static int READ_TIMEOUT = 250;
 public static int WRIT_TIMEOUT = 250;
 public static int CONNECT_TIMEOUT = 250;
 private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

 private static Retrofit.Builder builder =
   new Retrofit.Builder()
     .baseUrl(API_BASE_URL)     .addConverterFactory(GsonConverterFactory.create());

 public static <S> S createService(Class<S> serviceClass) {
  return createService(serviceClass, null);
 }

 public static <S> S createService(Class<S> serviceClass, final String authToken) {
  if (authToken != null) {
   httpClient.addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Interceptor.Chain chain) throws IOException {
     Request original = chain.request();

     // Request customization: add request headers
     Request.Builder requestBuilder = original.newBuilder()
       .method(original.method(), original.body());

     Request request = requestBuilder.build();
     return chain.proceed(request);
    }
   });
  }
  Retrofit retrofit = builder.client(getUnsafeOkHttpClient()).build();
  return retrofit.create(serviceClass);
 }

 private static OkHttpClient getUnsafeOkHttpClient() {
  try {
   // Create a trust manager that does not validate certificate chains
   final TrustManager[] trustAllCerts = new TrustManager[]{
     new X509TrustManager() {
      @Override
      public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
      }

      @Override
      public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
      }

      @Override
      public java.security.cert.X509Certificate[] getAcceptedIssuers() {
       X509Certificate[] x509Certificates = new X509Certificate[0];
       return x509Certificates;
      }
     }
   };

   // Install the all-trusting trust manager
   final SSLContext sslContext = SSLContext.getInstance("SSL");
   sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
   // Create an ssl socket factory with our all-trusting manager
   final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

   OkHttpClient okHttpClient =
     new OkHttpClient.Builder()
       .readTimeout(READ_TIMEOUT,TimeUnit.SECONDS)//設(shè)置讀取超時(shí)時(shí)間
       .writeTimeout(WRIT_TIMEOUT,TimeUnit.SECONDS)//設(shè)置寫的超時(shí)時(shí)間
       .connectTimeout(CONNECT_TIMEOUT,TimeUnit.SECONDS)
       .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
       .sslSocketFactory(sslSocketFactory)
       .hostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
         return true;
        }
       }).build();

   return okHttpClient;
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 }
}

使用說(shuō)明:

可以看出https 和http的服務(wù)類主要區(qū)別在于retrofit對(duì)象的構(gòu)造方法不同。

主要就是sslSocketFactory()方法。是用來(lái)添加sslsocketFactory的,也就是客戶端發(fā)送的請(qǐng)求都等于手持了這樣的證書,這樣就可以和服務(wù)器交互了。

SslsocketFactory對(duì)象的獲取方法如下:

final SSLContext sslContext = SSLContext.getInstance("SSL");
   sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
   final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

請(qǐng)求體和響應(yīng)體封裝:

 {
 "page":2,
 "pageSize":10
}

Json體類似如上所示的可以封裝為如下的請(qǐng)求體/響應(yīng)體,此處可以借用GsonFormat插件,輸入json體就可以快速生產(chǎn)請(qǐng)求體/響應(yīng)體bean類。

public class GetTradeDetailRequest {


 /**
  * page : 2
  * pageSize : 10
  */

 private int page;
 private int pageSize;

 public int getPage() {
  return page;
 }

 public void setPage(int page) {
  this.page = page;
 }

 public int getPageSize() {
  return pageSize;
 }

 public void setPageSize(int pageSize) {
  this.pageSize = pageSize;
 }
}

服務(wù)接口封裝:

public interface BalanceService {
 @GET("balance")
 Call<GetBalanceResponse> getBalance(@Header("AccessToken") String accessToken);

 @POST("balance/detail")
 Call<GetTradeDetailResponse> getDetail(@Header("AccessToken") String accessToken , @Body GetTradeDetailRequest tradeDetailRequest);
}

使用說(shuō)明:

此接口用來(lái)聲明請(qǐng)求類型,call聲明的類型是返回體的bean類,@header是請(qǐng)求的頭,@body是返回體的類型。

請(qǐng)求model封裝:

public class BalanceModel {
 private static BalanceModel balanceModel;
 private BalanceService mBalanceService;

 /**
  * Singleton
  */
 public static BalanceModel getInstance(Context context) {
  if (balanceModel == null) {
   balanceModel = new BalanceModel(context);
  }
  return balanceModel;
 }

 public BalanceModel(Context context) {
  mBalanceService = HttpsServiceGenerator.createService(BalanceService.class);
 }

 public Call<GetBalanceResponse> getBalanceResponseCall(String accessToken) {
  Call<GetBalanceResponse> balanceResponseCall = mBalanceService.getBalance(accessToken);
  return balanceResponseCall;
 }
}

使用說(shuō)明:

此接口用來(lái)聲明請(qǐng)求model的,主要用到的是上面的服務(wù)接口。 此類主要用來(lái)獲取網(wǎng)絡(luò)請(qǐng)求體的。

響應(yīng)事件回調(diào)類封裝:

public abstract class Callback<T extends Object> implements retrofit2.Callback<T> {

 @Override
 public void onResponse(Call<T> call, Response<T> response) {
  if (response.raw().code() == 200){
   Log.i("internet response","200");
   onSuccess(response);
  }else if (response.raw().code() == 404){
   Log.i("internet response","404");
   onNotFound();
  }
 }

 @Override
 public void onFailure(Call<T> call, Throwable t) {

 }


 public abstract void onSuccess(Response<T> response);

 public void onNotFound(){
  return;
 }
}

使用說(shuō)明:

通常在發(fā)送網(wǎng)絡(luò)請(qǐng)求的時(shí)候只有兩種結(jié)果,一是請(qǐng)求發(fā)送失敗,二是服務(wù)器接收到了請(qǐng)求并且響應(yīng)了。

onFailure()主要用來(lái)處理請(qǐng)求發(fā)送失敗的情況,onResponse()用來(lái)處理服務(wù)器的響應(yīng)內(nèi)容。

response.raw().code()的值就是我們?cè)诰W(wǎng)站開發(fā)中遇到的標(biāo)識(shí)代碼,200代表成功返回消息體,404代表api路徑?jīng)]找到(api路徑配置出錯(cuò)是會(huì)導(dǎo)致這樣的情況,當(dāng)然也可能是服務(wù)器的環(huán)境出了問(wèn)題,導(dǎo)致手機(jī)訪問(wèn)不到),500代表的是服務(wù)器內(nèi)部錯(cuò)誤(請(qǐng)求中的參數(shù)配置有誤會(huì)導(dǎo)致這樣的情況)。

代碼中使用:

private void httpLoginRequest(String phone, String password) {
  mPushToken = mPushAgent.getRegistrationId();
  GetLoginRequest loginRequest = new GetLoginRequest();
  loginRequest.setPhone(phone);
  loginRequest.setPassword(password);
  loginRequest.setPushtoken(mPushToken);
  loginRequest.setCarrier(mCarrier);
  final Call<GetLoginResponse> callLogin = loginModel.getLoginResponseCall(loginRequest);
  callLogin.enqueue(new Callback<GetLoginResponse>() {
   @Override
   public void onFailure(Call<GetLoginResponse> calllist, Throwable t) {
    ToastUtils.showToast(LoginActivity.this,"網(wǎng)絡(luò)服務(wù)異常");
    materialDialog.dismiss();
    callLogin.cancel();
   }

   @Override
   public void onSuccess(Response<GetLoginResponse> response) {
    GetLoginResponse loginResponse = response.body();
    userBean = loginResponse.getData();
    if (loginResponse.getErrcode() == 0) {
     ToastUtils.showToast(LoginActivity.this,"登錄成功");
     ActivityCollector.finishAll();
     startActivity(new Intent(LoginActivity.this, MapActivity.class));
     AppConfigUtils.getInstanse(LoginActivity.this).clearAll();
     AppConfigUtils.getInstanse(LoginActivity.this).setUserBean(userBean);
     materialDialog.dismiss();
    } else if (loginResponse.getErrcode() == 203) {
     ToastUtils.showToast(LoginActivity.this,"用戶名或密碼錯(cuò)誤");
     materialDialog.dismiss();
    }else if (loginResponse.getErrcode() == 999){
     materialDialog.dismiss();
     ToastUtils.showToast(LoginActivity.this,"服務(wù)器異常,請(qǐng)稍后再試");
    }
    callLogin.cancel();
   }

   @Override
   public void onNotFound() {
    materialDialog.dismiss();
    ToastUtils.showToast(LoginActivity.this,"404");
    super.onNotFound();
    callLogin.cancel();
   }
  });
 }
private void httpBalanceRequest(String accessToken) {
  BalanceModel balanceModel = BalanceModel.getInstance(getApplicationContext());
  final Call<GetBalanceResponse> balanceResponseCall = balanceModel.getBalanceResponseCall(accessToken);
  balanceResponseCall.enqueue(new Callback<GetBalanceResponse>() {
   @Override
   public void onResponse(Call<GetBalanceResponse> calllist, Response<GetBalanceResponse> response) {
    GetBalanceResponse balanceResponse = response.body();
    if (balanceResponse.getErrcode() == 0) {
     mMoneyTV.setText(balanceResponse.getData().getBalance());
    } else if (balanceResponse.getErrcode() == 999) {
     ToastUtils.showToast(BalanceActivity.this,"服務(wù)器異常,請(qǐng)稍后再試");
     mMoneyTV.setText("0.00");
    } else if (balanceResponse.getErrcode() == 403) {
     ToastUtils.showToast(BalanceActivity.this,"登錄已失效,請(qǐng)重新登錄");
     AppConfigUtils.getInstanse(BalanceActivity.this).clearAll();
     ActivityCollector.finishAll();
     LoginActivity.actionStart(BalanceActivity.this,mPhone,"");
    }
    balanceResponseCall.cancel();
   }

   @Override
   public void onFailure(Call<GetBalanceResponse> calllist, Throwable t) {
    ToastUtils.showToast(BalanceActivity.this,"網(wǎng)絡(luò)服務(wù)異常");
    balanceResponseCall.cancel();
   }
  });
 }

使用說(shuō)明:

這段代碼使用的是自己封裝的響應(yīng)事件回調(diào)類,當(dāng)然也可以用第二張圖retrofit默認(rèn)的那套,用自己封裝的有個(gè)好處就是404not found 可以處理進(jìn)行操作,如果用默認(rèn)的那套,在404的時(shí)候這段代碼就會(huì)崩潰。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳談Android中Matrix的set、pre、post的區(qū)別

    詳談Android中Matrix的set、pre、post的區(qū)別

    下面小編就為大家?guī)?lái)一篇詳談Android中Matrix的set、pre、post的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • android底部菜單欄實(shí)現(xiàn)原理與代碼

    android底部菜單欄實(shí)現(xiàn)原理與代碼

    底部菜單欄很重要,我看了一下很多應(yīng)用軟件都是用了底部菜單欄做,我這里使用了tabhost做了一種通用的(就是可以像微信那樣顯示未讀消息數(shù)量的,雖然之前也做過(guò)但是layout下的xml寫的太臃腫,這里去掉了很多不必要的層,個(gè)人看起來(lái)還是不錯(cuò)的,所以貼出來(lái)方便以后使用
    2013-01-01
  • Android Activity之間的數(shù)據(jù)傳遞方法總結(jié)

    Android Activity之間的數(shù)據(jù)傳遞方法總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于Android Activity之間的數(shù)據(jù)傳遞方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Android?Studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器源碼

    Android?Studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器源碼

    這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Golang+Android基于HttpURLConnection實(shí)現(xiàn)的文件上傳功能示例

    Golang+Android基于HttpURLConnection實(shí)現(xiàn)的文件上傳功能示例

    這篇文章主要介紹了Golang+Android基于HttpURLConnection實(shí)現(xiàn)的文件上傳功能,結(jié)合具體實(shí)例形式分析了Android基于HttpURLConnection的客戶端結(jié)合Go語(yǔ)言服務(wù)器端實(shí)現(xiàn)文件上傳功能的操作技巧,需要的朋友可以參考下
    2017-03-03
  • Android HelloChart開源庫(kù)圖表之折線圖的實(shí)例代碼

    Android HelloChart開源庫(kù)圖表之折線圖的實(shí)例代碼

    這篇文章主要介紹了Android HelloChart開源庫(kù)圖表之折線圖的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Android ProgressBar組件使用教程

    Android ProgressBar組件使用教程

    Android ProgressBar分為水平進(jìn)度條和圓形進(jìn)度條, 看官方的劃分是Indeterminate Progress(不確定的進(jìn)度) 和 Determinate Progress(決定進(jìn)度)下面有2個(gè)demo一個(gè)是圓形的進(jìn)度條和一個(gè)水平的進(jìn)度條
    2022-11-11
  • Android自定義View實(shí)現(xiàn)抖音飄動(dòng)紅心效果

    Android自定義View實(shí)現(xiàn)抖音飄動(dòng)紅心效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)抖音飄動(dòng)紅心效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • android listview進(jìn)階實(shí)例分享

    android listview進(jìn)階實(shí)例分享

    這篇文章主要介紹了android listview進(jìn)階實(shí)例分享,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Android的權(quán)限設(shè)置及自啟動(dòng)設(shè)置方法

    Android的權(quán)限設(shè)置及自啟動(dòng)設(shè)置方法

    今天小編就為大家分享一篇Android的權(quán)限設(shè)置及自啟動(dòng)設(shè)置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07

最新評(píng)論