IOException(MAIN_THREAD)使用InstanceID和ReactiveX

时间:2015-11-04 11:15:18

标签: java android google-cloud-messaging rx-android

我正在关注this architecture来构建应用。

我想获取设备的GCM令牌并将其发送到我的服务器。这是抛出异常的行:

String token = instanceID.getToken(Constants.SENDER_ID,
                   GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

当我使用RxAndroid时,我不明白为什么会发生这种情况,因为这一行是在一个新线程中执行的。我甚至同步向我的服务器发出请求,一切正常。

我如何配置Rx:

public class RegisterGcmUseCase {

  private Subscription subscription = Subscriptions.empty();

  public void execute(Subscriber UseCaseSubscriber) {
    this.subscription = this.buildUseCaseObservable()
      .subscribeOn(Schedulers.newThread())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(UseCaseSubscriber);
  }

  public Observable buildUseCaseObservable() {

    // ...

    InstanceID instanceID = InstanceID.getInstance(context);
    String token = "";

    try {
        token = instanceID.getToken(Constants.SENDER_ID,
                GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
    } catch (IOException e) {
        e.printStackTrace();
    }

    // ...

  }
}

知道发生了什么事吗?

感谢。

2 个答案:

答案 0 :(得分:1)

抛出异常是因为你在主线程上调用instanceID.getToken并且不允许这样做。在后台线程中调用此方法将解决此问题。

答案 1 :(得分:0)

您还没有提供足够详细的如何在buildUseCaseObservable()中构建Observable 。我怀疑在创建Observable时仍然会调用instanceID.getToken(...),这发生在主线程上。

我的建议是使用defer()运算符构造Observable,它将在订阅上构造Observable。