1. 程式人生 > >RxJava + Retrofit + OkhttpClient 學習

RxJava + Retrofit + OkhttpClient 學習

  1. 首先,建立OkhttpClient 和Retrofit的網路框架
  2. 其次,建立Retrofit的請求介面
  3. 最後,通過RxJava監聽觀察者並獲取請求介面的結果。
  4. 實踐:
/**
 * @author zhou.jn on 2018/11/22 13:38.
 */
public class App extends Application {
    private static final String TAG = "App";
    private static OkHttpClient okHttpClient;
    private static Retrofit retrofit;
private static App app; @Override public void onCreate() { super.onCreate(); app = this; OkhttpInstance(); RetrofitInstance(); } //1. 建立OkhttpClient private static OkHttpClient OkhttpInstance() { if (okHttpClient == null) { OkHttpClient.
Builder builder = new OkHttpClient.Builder() //設定連結超時時間 .connectTimeout(500, TimeUnit.MILLISECONDS) //設定讀取超時時間 .readTimeout(1000, TimeUnit.MILLISECONDS) //設定寫入超時時間 .writeTimeout(1000, TimeUnit.MILLISECONDS) //設定快取目錄
.cache(new Cache(app.getExternalCacheDir(), 10 * 1024 * 1024)) .build(); }); return okHttpClient; } else { return okHttpClient; } } public static Retrofit RetrofitInstance() { if (retrofit == null) { retrofit = new Retrofit.Builder() //新增基礎URL,需要以"/"結尾,例:"http://www.baidu.com/" .baseUrl(Http.DEFAULT_BASE_URL) //新增RxJava支援 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) /**新增解析方式(這裡可能會因為解析的方式不同,導致產生404或者解析字串不全的現象*/ .addConverterFactory(ScalarsConverterFactory.create()) .client(okHttpClient) .build(); return retrofit; } else { return retrofit; } } }

2.Retrofit註解中文版:https://www.jianshu.com/p/0fda3132cf98
瞭解@Post @[email protected]@

/**
 * @author zhou.jn on 2018/11/22 14:49.
 */
public interface Ipost {
	//介面請求,基本的請求要與後臺定義的請求協議一致,例:是否需要新增請求頭等。
    String REQUEST_HEAD = "User-Agent";
    String GET_IP_TAG = "client/ipinfo";
    String REQUEST_PERSONAL = "client/queryOttAccount";
    
    @POST(GET_IP_TAG)
    Observable<String> getPublicIp(@Header(REQUEST_HEAD) String headValue);
    
	//請求方式一:需使用拼接的字串進行請求,可以定義拼接字串
    @POST(REQUEST_PERSONAL)
    Observable<String> queryPersonInfo(@Body String content);
    
	//請求方式二:直接寫全請求介面,此時,將忽略在retrofit中設定的baseUrl 例: Http.DEFAULT_BASE_URL
    @POST("http://IP:Port/請求拼接的引數")
    Observable<String> queryRechargeInfo(@Body String content);
	 }

3.進行請求

 final Ipost ipost = App.RetrofitInstance().create(Ipost.class);
 MySubscriber subscriber = new MySubscriber(httpKey);
        ipost.queryPersonInfo(httpEnContent)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
              //以下注冊採用其一:
              //方式一: 自定義 註冊 
              .subscribe(subscriber);
              //方式二:
               .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        Log.i(TAG, "onCompleted: ");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.i(TAG, "onError: "+e.getMessage());
                    }

                    @Override
                    public void onNext(String s) {
                        Log.i(TAG, "onNext: "+s);
                        String decryptResult = AESUtils.decryptResult(s,httpKey);
                        Log.i(TAG,"解密後:"+decryptResult);
                    }
                });
public class MySubscriber extends Subscriber<String> {
    private static final String TAG = "MySubscriber";

    private String httpKey;
    private String decontent;
    public String result;


    public MySubscriber(String httpKey) {
        this.httpKey = httpKey;
    }
	//相比較,自定義Subscriber 多一個 onStart(),在onNext()之前被呼叫,可以進行一些初始化操作
    @Override
    public void onStart() {
        super.onStart();
        Log.i(TAG,"start");

    }

    @Override
    public void onCompleted() {
        Log.i(TAG,"completed");

    }

    @Override
    public void onError(Throwable e) {
        Log.i(TAG,"onError: "+e.getMessage());
    }

    @Override
    public void onNext(String enString) {
        Log.i(TAG, "onNext: "+ enString);
        String decryptResult = AESUtils.decryptResult(enString, httpKey);
        //獲取請求結果
        Log.i(TAG,"decryptResult: "+ decryptResult);
    }
}

4.結束