首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOException (MAIN_THREAD)使用InstanceID和ReactiveX

IOException (MAIN_THREAD)使用InstanceID和ReactiveX
EN

Stack Overflow用户
提问于 2015-11-04 19:15:18
回答 2查看 1K关注 0票数 1

我正在跟随this architecture构建一个应用程序。

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

代码语言:javascript
复制
String token = instanceID.getToken(Constants.SENDER_ID,
                   GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

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

如何配置Rx:

代码语言:javascript
复制
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();
    }

    // ...

  }
}

知道发生了什么事吗?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-09-13 19:19:29

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

票数 1
EN

Stack Overflow用户

发布于 2016-05-06 21:53:26

对于如何在buildUseCaseObservable()中构造可观察对象,您还没有提供足够的详细信息。我怀疑在创建Observable时,instanceID.getToken(...)仍在被调用,这发生在主线程上。

我的建议是使用defer()运算符来构造可观测对象,这将在订阅上构造可观测对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33520392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档