java - 使用 InstanceID 和 ReactiveX 的 IOException (MAIN_THREAD)

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

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

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

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

    // ...

  }
}

知道发生了什么吗?

谢谢。

最佳答案

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

关于java - 使用 InstanceID 和 ReactiveX 的 IOException (MAIN_THREAD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33520392/

相关文章:

java - 获取注册错误 :Account missing when integrating GCM for pushwoosh in android

android - 如何在屏幕锁定时显示推送通知

java - Android 用不同的 View 替换 View 但保留原始约束

java - 设置ejb定时器任务的参数来执行后端进程

android - 适用于 Android 的 Titanium/Appcelerator : Multiple density images not found

android - 智能手机/平板电脑开发之间的区别?

java - 我可以在 android studio 中将布局 View 转换为 pdf 文件吗?

java - R. 再次显示 xml 时出现错误

java - 使用静态内部类创建java单例

android - GCMRegistrar.getRegistrationId(this) 始终返回空字符串(使用 GCM 的 Android 推送通知)