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 @Path@Body@

/**
 * @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.结束

猜你喜欢

转载自blog.csdn.net/weixin_37716758/article/details/84550286