Retrofit2+RxJava2进行网络请求

来源:互联网 发布:手机一直恢复系统数据 编辑:程序博客网 时间:2024/05/16 10:03
请注明出处: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);    }}

参考文档

阅读全文
0 0
原创粉丝点击