我有一个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();
每次从数据库中删除项目时,您都会立即从下一个方法的订阅中的数据库中获取新列表。
答案 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()
来缓存该值。