Android 如何设置应用程序级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

背景

我有多种方法从服务器获取数据,例如后台轮询和服务器推送。这些项目可能包含相同的项目。当数据准备好后,我将这些数据插入Android Room的数据库。当数据库中存在插入项时,我将中止该项。我希望在这些数据插入成功时收到通知,因此我在Dao中使用livedata:

@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
中,我收到数据更改通知。我将处理这些数据,然后设置类的一个属性(set
isNew=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));
    }