每次事件发生时,RxJava都会使用订阅方法

时间:2017-12-01 17:07:17

标签: android rx-java2 android-room

我有一个observable,在订阅时执行一个很长的操作,但是当用户点击一个按钮时,我想通知我的observable再次执行长操作,因为有些东西发生了变化。

每次用户点击按钮时,我都不想再订阅新订阅。哪个是实现这个目标的最佳解决方案?

我想知道是否可以使用一种解决方案,它使用rxjava简化的方式在不同的线程上运行代码。

我应该使用这样的东西吗?

BehaviourProcessor<boolean> processor = BehaviourProcessor.createDefault(true);

public Flowable<List<Item>> getItems(){
     return Flowable.create(e -> e.onNext(longOp()))
                .subscribeOn(Schedulers.io())
                .switchMap(items -> processor.map(notify -> returnItems(notify)));    
}

public void notifyChange(){
   processor.onNext(true);
}

Android Room库实现了这个结果,实际上当你订阅它时:

   @Query("SELECT * FROM user")
   Flowable<List<Item>> getUsers();

每次从数据库中删除项目时,您都会立即从下一个方法的订阅中的数据库中获取新列表。

1 个答案:

答案 0 :(得分:0)

不是让nb_unit = 7 inp_shape = (maxlen, 7) loss_ = "categorical_crossentropy" metrics_ = "categorical_crossentropy" optimizer_ = "Nadam" nb_epoch = 250 batch_size = 64 model = Sequential() model.add(LSTM(units=nb_unit, input_shape=inp_shape, return_sequences=True)) # LSTG/GRU/SimpleRNN model.add(Dense(7, activation='softmax')) # New model.compile(loss=loss_, optimizer=optimizer_, metrics=[metrics_]) checkpoint = ModelCheckpoint("lstm_simple.h5", monitor=loss_, verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1) early = EarlyStopping( monitor='loss', min_delta=0, patience=10, verbose=1, mode='auto') 返回您显示的可观察链,而是返回一个共享的可观察链。

getItems()

这仅在观察者链上创建,您可以根据需要订阅多次。但是,如果没有订阅者并且另一个订阅者出现,则将再次调用Flowable<List<Item>> itemGetter = Flowable.create(e -> e.onNext( longOp() ) ) .subscribeOn( Schedulers.io() ) .switchMap(items -> processor.map(notify -> returnItems(notify))) .replay( 1 ) .publish(); Flowable<List<Item>> getItem() { return itemGetter; }

如果您不希望这种情况发生,那么您应该考虑使用longOp()来缓存该值。