java封装有哪三步_三步Retrofit2+RxJava2+OkHttp3网络请求封装

今天来分享一下Retrofit2+RxJava2+OkHttp3的封装。

第一步 - 那自然是引用相关的库:

compile 'com.squareup.retrofit2:retrofit:2.3.0'

compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

// gson解析,可以自行替换

compile 'com.squareup.retrofit2:converter-gson:2.3.0'

compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

// 日志的拦截器,也可以自行选择

compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

compile 'io.reactivex.rxjava2:rxjava:2.0.1'

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

第二步,我们在Application创建一个OkHttpClient:

public class MyApplication extends Application {

private static final int TIMEOUT_READ = 15;

private static final int TIMEOUT_CONNECTION = 15;

private static OkHttpClient mOkHttpClient;

public OkHttpClient genericClient() {

if (mOkHttpClient != null)

return mOkHttpClient;

HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();

HttpLoggingInterceptor.Level level = BuildConfig.IS_DEBUG ?

HttpLoggingInterceptor.Level.HEADERS :

HttpLoggingInterceptor.Level.NONE;

logInterceptor.setLevel(level);

return mOkHttpClient = new OkHttpClient.Builder()

.retryOnConnectionFailure(true)

.addInterceptor(logInterceptor)

.addNetworkInterceptor(new CacheInterceptor())

.readTimeout(TIMEOUT_READ, TimeUnit.SECONDS)

.connectTimeout(TIMEOUT_CONNECTION, TimeUnit.SECONDS)

.build();

}

}

创建好了,先放着等后面需要使用。

第三步,创建一个BaseApi类:

该类有两个主要职责,1.负责创建Retrofit的实例;2.执行网络请求。

public class BaseApi {

// 创建网络接口请求实例

public static T createApi(Class service) {

final String url = KEY_BASE_URL;

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(url)

.addConverterFactory(GsonConverterFactory.create())

// 注意这里使用了刚才在application里提供创建okhttp的方法

.client(MyApplication.getApplication().genericClient())

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.build();

return retrofit.create(service);

}

// 执行网络请求

public static void request(Observable observable,

final IResponseListener listener) {

if (!NetUtils.isConnected(MyApplication.getApplication())) {

ToastUtils.getInstance().showToast("网络不可用,请检查网络");

if (listener != null) {

listener.onFail();

}

return;

}

observable.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer() {

@Override

public void onError(Throwable e) {

e.printStackTrace();

LogUtils.d("onError", e.getMessage());

if (listener != null) {

listener.onFail();

}

}

@Override

public void onComplete() {

}

@Override

public void onSubscribe(Disposable disposable) {

}

@Override

public void onNext(T data) {

if (listener != null) {

listener.onSuccess(data);

}

}

}

);

public interface IResponseListener {

void onSuccess(T data);

void onFail();

}

}

这样一个封装就完成了,下面我用demo来测试一下效果:

public class MainActivity extends AppCompatActivity {

private TextView tvTest;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

tvTest = (TextView) findViewById(R.id.tv_test);

BaseApi.request(BaseApi.createApi(IServiceApi.class).getBookInfo(),

new BaseApi.IResponseListener() {

@Override

public void onSuccess(Book data) {

tvTest.setText(data.summary);

}

@Override

public void onFail() {

}

});

}

}

效果就不演示了,放出 demo大家可以下载看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值