Android 如何设置应用程序级livedata观察者模式
背景 我有多种方法从服务器获取数据,例如后台轮询和服务器推送。这些项目可能包含相同的项目。当数据准备好后,我将这些数据插入Android Room的数据库。当数据库中存在插入项时,我将中止该项。我希望在这些数据插入成功时收到通知,因此我在Dao中使用livedata:Android 如何设置应用程序级livedata观察者模式,android,android-room,android-livedata,Android,Android Room,Android Livedata,背景 我有多种方法从服务器获取数据,例如后台轮询和服务器推送。这些项目可能包含相同的项目。当数据准备好后,我将这些数据插入Android Room的数据库。当数据库中存在插入项时,我将中止该项。我希望在这些数据插入成功时收到通知,因此我在Dao中使用livedata: @Dao public interface WordDao { @Query("SELECT * from word_table where isNew = 0") LiveData<List<Wo
@Dao
public interface WordDao {
@Query("SELECT * from word_table where isNew = 0")
LiveData<List<Word>> getAlphabetizedWords();
@Insert
void insert(List<Word> word);
@Update
void update(List<Word> words);
}
在DatabaseObserver
中,我收到数据更改通知。我将处理这些数据,然后设置类的一个属性(setisNew=1
)以指示该项已被处理。同时,保留后面插入的句柄将不会通知旧的插入数据
我的问题
observeForver()
将按预期工作DatabaseObserver
的onChanged
方法接收相同的项目列表。在我像这样更改代码之后,问题仍然存在。如何解决这个问题您想创建一个全局LiveData,您可以在任何地方收听,并在任何地方更新时收到通知?@RohanKandwal yeah@penkzhou我还没有使用LiveData到这种程度,但Flowable确实可以工作。你可以在任何地方订阅,任何次数。如果您准备好切换到RX,我可能会提供帮助。@penkzhou在这种情况下,wordRepository.getAllWords()应该返回LiveData,对吗?只需将该LiveData设置为公共全局字段,并在任何活动/服务/片段的LiveData上设置observeForver即可。您确定需要observeForver吗?如果已经观察到该数据,您将获得IllegalArgumentException,并且需要手动调用removeObserver()。关于插入的数据,请使用OnConflictStrategy或将unique设置为true的apply索引,这样就不需要手动检查。
@Override
public void onCreate() {
super.onCreate();
wordRepository = WordRepository.getInstance(this);
wordRepository.getAllWords().observeForever(new DatabaseObserver(this));
}