RxGroups

轻松将RxJava Observables组合在一起并将其绑定到您的Android Activity生命周期
696
作者Felipe Lima

RxGroups 允许您将 RxJava `Observable` 组合成组,并将其绑定到您的 Android 生命周期。这在与 Retrofit 一起使用时尤其有用。

对于简单的场景,您可能只需让原始请求被取消并发起一个新的请求。但是,很容易看出这在更复杂的场景中是如何成为一个问题的。

假设您的用户正在提交付款。您可能希望保证您可以在旋转屏幕或离开 Activity 后返回时重新附加到相同的进行中或已完成的请求。

RxGroups 还会自动防止事件在 `onResume()` 之前和 `onPause()` 之后传递到您的 `Activity` 或 `Fragment`。如果发生这种情况,它们将自动缓存在内存中,并在用户返回您的屏幕后传递。如果他们从未返回,则内存将在 `onDestroy()` 后自动回收。

用法

  1. 向您的 `Activity`、`Fragment`、`Dialog` 等添加一个 `GroupLifecycleManager` 字段,并根据您自己的生命周期方法调用其相应的方法(例如:`onPause`、`onResume`、`onDestroy` 等);
  2. 使用 `@AutoResubscribe` 注解您的 `ResubscriptionObserver`,并使用 `resubscriptionTag()` 方法告诉 RxGroups 它应该使用哪个标签来自动将您的 `Observer` 重新附加到其 `Observable`。
  3. 在订阅您的 `Observable` 之前,使用 `observableGroup.transform()` 与其组合以为此 `Observable` 定义一个标签;

示例

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`。

使用 Gradle 下载

compile 'com.airbnb:rxgroups-android:0.3.5'

查看 示例应用程序 以了解更多详细信息和完整的示例!

开发版本的快照可在 Sonatype 的 `snapshots` 存储库 中找到。