1.依赖配置 (build.gradle
)
需添加以下依赖(确保版本兼容):
Groovy
implementation 'io.reactivex.rxjava2:rxjava:2.2.20'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
2.线程调度
subscribeOn(Schedulers.io())
:指定网络请求在IO线程(非主线程)执行,避免阻塞UI。observeOn(AndroidSchedulers.mainThread())
:将结果切换到主线程更新UI,否则会崩溃。
3.操作符使用
map()
:转换数据格式(如JSON解析),链式调用保持代码简。- 其他常用操作符:
flatMap()
:异步嵌套请求(如先登录后获取用户信息)。filter()
:过滤无效数据。zip()
:合并多个请求结果
4.示例场景:模拟网络请求获取数据,处理结果后更新 UI
java
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public class MainActivity extends AppCompatActivity {
private TextView tvResult;
private CompositeDisposable compositeDisposable = new CompositeDisposable();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvResult = findViewById(R.id.tv_result);
// 1. 创建 Observable(模拟网络请求)
Observable<String> observable = Observable.create(emitter -> {
try {
Log.d("RxJava", "网络请求线程: " + Thread.currentThread().getName());
Thread.sleep(2000); // 模拟网络延迟
String data = "{\"name\":\"RxJava\", \"version\":2}"; // 模拟返回的JSON数据
emitter.onNext(data); // 发送成功数据
emitter.onComplete();
} catch (Exception e) {
emitter.onError(e); // 发送错误
}
});
// 2. 订阅并处理结果
Disposable disposable = observable
.subscribeOn(Schedulers.io()) // 指定网络请求在IO线程执行
.observeOn(AndroidSchedulers.mainThread()) // 指定结果处理在主线程
.map(json -> { // 使用map操作符转换数据
// 模拟JSON解析(实际可用Gson等库)
return "解析结果: " + json.replace("\"", "");
})
.subscribe(
result -> tvResult.setText(result), // onNext: 更新UI
error -> Toast.makeText(this, "请求失败: " + error.getMessage(), Toast.LENGTH_SHORT).show(), // onError
() -> Log.d("RxJava", "请求完成") // onComplete
);
compositeDisposable.add(disposable); // 统一管理订阅
}
@Override
protected void onDestroy() {
super.onDestroy();
compositeDisposable.clear(); // 防止内存泄漏
}
}