Retrofit2+RxJava2进行网络请求

xiaoxiao2021-02-28  138

原文地址声明:http://blog.csdn.net/qq_23179075/article/details/77740373

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); } }
转载请注明原文地址: https://www.6miu.com/read-24093.html

最新回复(0)