2015-05-21 3 views
0

Сегодня я увидел какой-то код, который заставил меня съежиться, но я не был уверен, как это исправить.Что делать с несколькими наблюдаемыми различного типа?

существу код использует .zip на нескольких звонков в полу-цепь их вместе, а затем действовать на результат:

Observable.zip(service.getObservable1(), service.getObservable2(), service.getObservable3(), new Func3<Type1, Type2, Type3>(){ 
    public Object call(Type1 type1, Type2 type2, Type3 type3){ 
      // set a bunch of globals 
      mGlobalState.setType1(type1); 
      mGlobalState.setType2(type2); 
      mGlobalSession.setType3(type3); 
      return null; 
    } 
}).subscribe(mObserver); 

Так много вещей, кажется неправильным; установив глобальное состояние в .zip-вызов, возвращая нуль и фактически не используя .zip по своему назначению. Кроме того, onNext наблюдателя не использует результат, но зависит от побочных эффектов установки глобального состояния в .zip.

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

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

ответ

0

Многие разработчики Android используют Retrolambda для выполнения backporting lambdas во время сборки и имеют некоторые преимущества Java 8, оставаясь при этом совместимыми.

Вы можете установить глобальные переменные из функции, если вы знаете, что будет только один вызов, который делает это, но эта структура также подразумевает, что вам нужно блокировать где-либо, пока zip не выполнит свою работу до того, как код сможет перейти на следующий логический экран.

1

Я считаю, что элегантное решение создает объект для группировки всех полученных данных и испускания, а затем в результате вашей функции zip.

@Test 
public void testSample() { 
    Observable<String> a = Observable.just("a"); 
    Observable<Integer> b = Observable.just(1); 
    Observable<Boolean> c = Observable.just(true); 

    Observable.zip(a, b, c, Result::new).subscribe(result -> { 
     // save data into your globals 
    }); 
} 

public class Result { 
    private final String a; 
    private final int b; 
    private final boolean c; 

    public Result(String a, int b, boolean c) { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
    } 

    public String getA() { 
     return a; 
    } 

    public int getB() { 
     return b; 
    } 

    public boolean isC() { 
     return c; 
    } 
} 
Смежные вопросы