Retrofit2+RxJava2进行网络请求
2017-08-31 10:14
387 查看
[b]请注明出处:http://blog.csdn.net/qq_23179075/article/details/77740373[/b]
Retrofit2+RxJava2进行网络请求
Gradle中添加依赖:
compile 'io.reactivex.rxjava2:rxjava:2.1.2' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' compile 'com.squareup.okhttp3:okhttp:3.8.1' compile 'com.squareup.okhttp3:logging-interceptor:3.8.1'
定义API接口:
public interface HttpApi { @POST("api/authenticate") Observable<LoginResponse> login(@Body LoginRequest request); }
创建一个Retrofit客户端:
public class RetrofitProvider { public static Retrofit create() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.readTimeout(10, TimeUnit.SECONDS); builder.connectTimeout(10, TimeUnit.SECONDS); if (BuildConfig.DEBUG) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); builder.addInterceptor(interceptor); } return new Retrofit.Builder() .baseUrl(BASE_URL) .client(builder.build()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } }
发起请求:
public class MainActivity extends AppCompatActivity { @BindView(R.id.et_name) EditText etName; @BindView(R.id.et_password) EditText etPassword; @BindView(R.id.btn_login) Button btnLogin; /** * 如果在请求的过程中Activity已经退出了, 这个时候如果回到主线程去更新UI, 那么APP肯定就崩溃了 * 使用Disposable 是个开关, 调用它的dispose()方法时就会切断水管, 使得下游收不到事件, 既然收不到事件, * 那么也就不会再去更新UI了. 因此我们可以在Activity中将这个Disposable 保存起来, 当Activity退出时, * 切断它即可. * RxJava中已经内置了一个容器CompositeDisposable, * 每当我们得到一个Disposable时就调用 * CompositeDisposable.add()将它添加到容器中, * 在退出的时候, 调用CompositeDisposable.clear() * 即可切断所有的水管. */ private CompositeDisposable disposables = new CompositeDisposable(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); } private void login(LoginRequest loginRequest) { HttpApi api = RetrofitProvider.create().create(HttpApi.class); api.login(loginRequest) .subscribeOn(Schedulers.io())//网络是耗时操作,所以在io线程中去执行 .observeOn(AndroidSchedulers.mainThread())//请求成功后回到主线程中 .subscribe(new Observer<LoginResponse>() { @Override public void onSubscribe(Disposable d) { //保存Disposable disposables.add(d); } @Override public void onNext(LoginResponse loginResponse) { Log.d("MainActivity", "登录成功:"+loginResponse.toString()); } @Override public void onError(Throwable e) { Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show(); } @Override public void onComplete() { Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show(); } }); } @Override protected void onDestroy() { super.onDestroy(); //Activity销毁时断所有连接 disposables.clear(); } @OnClick(R.id.btn_login) public void onViewClicked() { LoginRequest request = new LoginRequest(); request.setUsername(etName.getText().toString().trim()); request.setPassword(etPassword.getText().toString().trim()); login(request); } }
参考文档
相关文章推荐
- Retrofit2+Rxjava2如何主动取消网络请求
- [置顶] Android Kotlin 开发--偶遇Rxjava、Retrofit进行网络请求
- rxjava2 与 retrofit 网络请求
- Retrofit进行网络请求
- Android Kotlin(二)—— Kotlin与Retrofit进行网络请求RecyclerView展示图片列表
- Android网络请求Retrofit进行二次封装,拿过来就能用
- 关于retrofit进行网络请求时发生的奇怪错误
- 智能厨房重构-Retrofit和RxJava进行网络请求
- 使用Retrofit进行网络请求
- 还不会使用OkHttp和Retrofit进行Android网络请求?看看这篇你就会了!
- 使用Retrofit进行Http、Https网络请求(快速上手)
- AndroidStudio下使用Retrofit进行网络请求
- 使用Retrofit进行Http、Https网络请求(快速上手)
- 利用Retrofit进行各种网络请求
- MVP+Retrofit+RxJava请求网络数据实现RecyclerView多条目展示
- Android Retrofit网络请求Service,@Path、@Query、@QueryMap、@Map...
- Android网络请求框架Retrofit详解
- Android主流网络请求开源库的对比(Android-Async-Http、Volley、OkHttp、Retrofit)
- Retrofit2.0+RxJava+RxAndroid——强强联合的网络请求框架
- 使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求 (转)