Retrofit2+RxJava2进行网络请求

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23179075/article/details/77740373
请注明出处: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);
    }
}

参考文档

猜你喜欢

转载自blog.csdn.net/qq_23179075/article/details/77740373
今日推荐