我正在跟随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();
}
// ...
}
}知道发生了什么事吗?
谢谢。
发布于 2016-09-13 19:19:29
抛出异常是因为您在主线程上调用instanceID.getToken,而这是不允许的。在后台线程中调用此方法将解决此问题。
发布于 2016-05-06 21:53:26
对于如何在buildUseCaseObservable()中构造可观察对象,您还没有提供足够的详细信息。我怀疑在创建Observable时,instanceID.getToken(...)仍在被调用,这发生在主线程上。
我的建议是使用defer()运算符来构造可观测对象,这将在订阅上构造可观测对象。
https://stackoverflow.com/questions/33520392
复制相似问题