您的位置:首页 > 理论基础 > 计算机网络

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);
}
}


参考文档

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息