2015-11-04 2 views
1

Я следую this architecture, чтобы создать приложение.IOException (MAIN_THREAD) с использованием InstanceID и ReactiveX

Я хочу получить маркер GCM устройства и отправить его на свой сервер. Это линия, где брошено исключение:

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

Как я AMB с помощью 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(); 
    } 

    // ... 

    } 
} 

Любая идея, что происходит?

Спасибо.

ответ

0

Вы не указали достаточно деталей как Наблюдаемый построен в buildUseCaseObservable(). Я подозреваю, что instanceID.getToken(...) все еще вызывается, когда создается Observable, что происходит в основном потоке.

Мое предложение состоит в том, чтобы скорее построить Observable с помощью оператора defer(), который построит Observable при подписке.

0

Исключение выбрано потому, что вы вызываете instanceID.getToken в основном потоке, и это недопустимо. Вызов этого метода в фоновом потоке решит проблему.

Смежные вопросы