LiveData 不会将数据从一个活动更新到另一个活动 - Android

Aks*_*iya 4 android android-room android-livedata android-architecture-components

我有 2 个Activity可视化

  1. 列表 Activity
  2. 细节 Activity

该列表Activity显示项目列表,并Activity在单击列表中的项目时显示详细信息。在ListActivity我们观察从数据库获取提要后,我们会更新 UI。

列表页面

feedViewModel.getFeeds().observe(this, Observer { feeds ->
      feeds?.apply {
            feedAdapter.swap(feeds)
            feedAdapter.notifyDataSetChanged()
      }
})
Run Code Online (Sandbox Code Playgroud)

现在我们有一个DetailActivity更新提要(项目)并Activity完成的页面,但更改未反映在ListActivity.

详情页面

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        feedViewModel.setFeedId(id)
        feedViewModel.updateFeed()
}
Run Code Online (Sandbox Code Playgroud)

饲料视图模型

class FeedViewModel(application: Application) : AndroidViewModel(application) {


    private val feedRepository = FeedRepository(FeedService.create(getToken(getApplication())),
            DatabaseCreator(application).database.feedDao())

    /**
     * Holds the id of the feed
     */
    private val feedId: MutableLiveData<Long> = MutableLiveData()

    /**
     * Complete list of feeds
     */
    private var feeds: LiveData<Resource<List<Feed>>> = MutableLiveData()

    /**
     * Particular feed based upon the live feed id
     */
    private var feed: LiveData<Resource<Feed>>

    init {
        feeds = feedRepository.feeds
        feed = Transformations.switchMap(feedId) { id ->
            feedRepository.getFeed(id)
        }
    }

    /**
     * Get list of feeds
     */
    fun getFeeds() = feeds

    fun setFeedId(id: Long) {
        feedId.value = id
    }

    /**
     * Update the feed
     */
    fun updateFeed() {
        feedRepository.updateFeed()
    }

    /**
     * Get feed based upon the feed id
     */
    fun getFeed(): LiveData<Resource<Feed>> {
        return feed
    }

}
Run Code Online (Sandbox Code Playgroud)

为了简单起见,一些代码被抽象出来。如果需要,我可以添加它们来跟踪问题

Aks*_*iya 5

经过大量调查并从另一个问题的这个答案中得到了一些想法。我想通了这个问题。

问题

DatabaseCreator(application).database.feedDao()是没有创造由于其第一数据库的单一实例Activity有另一个实例,其中LiveData被监听的变化和第二Activity有另一个实例,其中更新数据后回调被忽略。

解决方案

使用 Dagger 或任何其他依赖注入来确保只创建 DB 和 DAO 的单个实例。