RxGroups 允许您将 RxJava `Observable` 组合成组,并将其绑定到您的 Android 生命周期。这在与 Retrofit 一起使用时尤其有用。
对于简单的场景,您可能只需让原始请求被取消并发起一个新的请求。但是,很容易看出这在更复杂的场景中是如何成为一个问题的。
假设您的用户正在提交付款。您可能希望保证您可以在旋转屏幕或离开 Activity 后返回时重新附加到相同的进行中或已完成的请求。
RxGroups 还会自动防止事件在 `onResume()` 之前和 `onPause()` 之后传递到您的 `Activity` 或 `Fragment`。如果发生这种情况,它们将自动缓存在内存中,并在用户返回您的屏幕后传递。如果他们从未返回,则内存将在 `onDestroy()` 后自动回收。
public class MyActivity extends Activity {
private static final String OBSERVABLE_TAG = "arbitrary_tag";
private TextView output;
private FloatingActionButton button;
private GroupLifecycleManager groupLifecycleManager;
private ObservableGroup observableGroup;
private Observable<Long> observable = Observable.interval(1, 1, TimeUnit.SECONDS);
// The Observer field must be public, otherwise RxGroups can't access it
@AutoResubscribe public final ResubscriptionObserver<Long> observer = new ResubscriptionObserver<Long>() {
@Override public void onCompleted() {
Log.d(TAG, "onCompleted()");
}
@Override public void onError(Throwable e) {
Log.e(TAG, "onError()", e);
}
@Override public void onNext(Long l) {
output.setText(output.getText() + " " + l);
}
@Override public Object resubscriptionTag() {
return OBSERVABLE_TAG;
}
};
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
output = (TextView) findViewById(R.id.txt_output);
button = (FloatingActionButton) findViewById(R.id.fab);
SampleApplication application = (SampleApplication) getApplication();
ObservableManager manager = application.observableManager();
groupLifecycleManager = GroupLifecycleManager.onCreate(manager, savedInstanceState, this);
observableGroup = groupLifecycleManager.group();
button.setOnClickListener(v -> observable
.compose(observableGroup.<Long>transform(OBSERVABLE_TAG))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer));
}
@Override protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
groupLifecycleManager.onSaveInstanceState(outState);
}
@Override protected void onResume() {
super.onResume();
groupLifecycleManager.onResume();
}
@Override protected void onPause() {
super.onPause();
groupLifecycleManager.onPause();
}
@Override protected void onDestroy() {
super.onDestroy();
groupLifecycleManager.onDestroy(this);
}
}
可选:如果您不想使用带有 `@AutoResubscribe` 的 `ResubscriptionObserver`,只需使用一个带有名为 `resubscriptionTag()` 的公共方法的常规 `Observer` 匿名类。例如:
@AutoResubscribe public final Observer<Long> observer = new Observer<Long>() {
@Override public void onCompleted() {
}
@Override public void onError(Throwable e) {
}
@Override public void onNext(Long l) {
}
public Object resubscriptionTag() {
return Arrays.asList("tag1", "tag2", "tag3");
}
};
如果该方法不存在或不是 `public`,RxGroups 将抛出一个 `RuntimeException` 来通知您。您可以为您的 `Observer` 使用任何 `Object` 标签,包括数组和 `List`,在这种情况下,它将 `Observer` 与集合中的所有标签关联,允许您与多个 `Observables` 共享相同的 `Observer`。
compile 'com.airbnb:rxgroups-android:0.3.5'
查看 示例应用程序 以了解更多详细信息和完整的示例!
开发版本的快照可在 Sonatype 的 `snapshots` 存储库 中找到。