2015-01-21 4 views
1

Учитывая это простой наблюдатель и абонент комбо, который просто наблюдает файл ввод-вывод, а затем обновление в подписчику на основе значения:RxJava андроид - делает блок наблюдателя

Observable.just(preferences.getBoolean(C"vibrate", false)) 
      .subscribeOn(Schedulers.io())//observe on new thread 
      .observeOn(AndroidSchedulers.mainThread()) //subscribe(listen) on main thread 
      .subscribe(new Action1<Boolean>() { 
       @Override 
       public void call(Boolean shouldVibrate) { 
        if (shouldVibrate) 
         Toast.makeText(context,"i should vibrate now",Toast.SHORT).show(); 
       } 

      }); 

Мой вопрос, не делает блок наблюдателя до записи завершено ? Даже если я укажу другой поток (поток IO), этот наблюдатель все еще блокирует один раз, вызванный подписчиком?

+0

Вы рассматриваете 'preferences.getBoolean' быть«файл ввод-вывод»здесь? –

+0

Я думаю [эти] (http://stackoverflow.com/questions/23447077/android-rxjava-non-blocking?rq=1) [вопросы] (http://stackoverflow.com/questions/25853696/ui-blocking -occurs-in-android-несмотря-rxjava? lq = 1) может помочь? –

+0

да его файл IO, так как он записывает на диск. Это на самом деле просто пример, который я делал. – j2emanue

ответ

1

Ваш Observer не будет блокировать в качестве операции можно сделать, прежде чем вы подписаться на Observer (так, он просто будет испускать ваше значение)

Что касается кода (Java 8 стиль для простоты):

Observable.just(preferences.getBoolean("vibrate", false)) 
     .subscribeOn(Schedulers.io())//observe on new thread 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(shouldVibrate) -> { 
       if (shouldVibrate) { 
        Toast.makeText(context,"i should vibrate now",Toast.SHORT).show(); 
       } 
     }); 

вы можете извлечь вызов в качестве переменной preferences.getBoolean(C"vibrate", false):

Boolean vibrate = preferences.getBoolean("vibrate", false); 
Observable.just(vibrate) 
     .subscribeOn(Schedulers.io())//observe on new thread 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(shouldVibrate) -> { 
       if (shouldVibrate) { 
        Toast.makeText(context,"i should vibrate now",Toast.SHORT).show(); 
       } 
     }); 

как вы можете видеть, vibrate будет вычислен до и после этого основной поток будет заблокирован.

Вы должны написать «ленивый» звонок к методу с использованием метода Observable.create

Observable.create(sub -> { 
       Boolean vibrate = preferences.getBoolean("vibrate", false); 
       sub.onNext(vibrate); 
       sub.onCompleted(); 

     }) 
     .subscribeOn(Schedulers.io())//observe on new thread 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(shouldVibrate) -> { 
       if (shouldVibrate) { 
        Toast.makeText(context,"i should vibrate now",Toast.SHORT).show(); 
       } 
     }); 

С помощью этого кода, то Boolean vibrate = preferences.getBoolean("vibrate", false); будет называться только тогда, когда вы подписаться на Observer.

(относительно к вашему, если в вашем абоненте, вы можете изменить его с filter)

 Observable.create(sub -> { 
       Boolean vibrate = preferences.getBoolean("vibrate", false); 
       sub.onNext(vibrate); 
       sub.onCompleted(); 

     }) 
     .filter((value) -> value) 
     .subscribeOn(Schedulers.io())//observe on new thread 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(shouldVibrate) -> { 
        Toast.makeText(context,"i should vibrate now",Toast.SHORT).show(); 
     }); 
Смежные вопросы