首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MediaBrowserServiceCompat中从房间加载项目

在MediaBrowserServiceCompat中从房间加载项目
EN

Stack Overflow用户
提问于 2019-04-09 17:05:53
回答 1查看 355关注 0票数 3

我正在开发一个使用Android体系结构组件的音频应用程序。我有一个服务,它扩展了MediaBrowserServiceCompat,并使用MediaBrowserCompat扩展了一个片段。

当我在服务的onLoadChildren()方法中对歌曲进行硬编码时,一切都运行得很好。但是我把我的歌曲存储在一个Room数据库中,并希望将它们加载到onLoadChildren()方法中。这就是我在挣扎的地方。

我尝试加载歌曲的方式有两种:

1) SongsDAO:

代码语言:javascript
复制
@Query("SELECT * FROM songs ORDER BY name COLLATE UNICODE ASC")
List<Song> getSongs();

服务:

代码语言:javascript
复制
 @Override
 public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) {
     result.detach();
     songsRepository = new SongsRepository(getApplication());
     List<Song> songs = songsRepository.getSongs();

     List<MediaBrowserCompat.MediaItem> mediaItems = convertToMediaItems(songs);
     result.sendResult(mediaItems);
 }

这样,我得到一个错误,那个Room查询是在主线程上执行的。一种可能的方法可能是将方法封装到AsyncTask中,但我相信还有更好的方法。

2) SongsDAO:

代码语言:javascript
复制
@Query("SELECT * FROM songs ORDER BY name COLLATE UNICODE ASC")
LiveData<List<Song>> getSongs();

服务:

代码语言:javascript
复制
 @Override
 public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) {
     result.detach();
     songsRepository = new SongsRepository(getApplication());
     LiveData<List<Song>> songs = songsRepository.getSongs();

     songs.observe(???, (Observer<List<Song>>) songs1 -> {
        List<MediaBrowserCompat.MediaItem> mediaItems = mapToMediaItems(songs1);
        result.sendResult(mediaItems);
    });
 }

这样,我不知道如何处理LiveData歌曲。它们不能在循环中迭代,而且可能也不会被观察到,因为没有任何东西可以用作LifecycleOwner (观测方法的第一个参数)。

我找不到任何关于如何解决这个用例的最佳实践。我想有一个点(单点真理)类,它将包含所有的歌曲在应用程序。然后,它可以在服务中用于向应用程序的UI (RecyclerView)以及其他应用程序(Android )提供数据。我想访问这些歌曲在应用程序的任何地方-当我添加一首新歌曲或删除任何从房间数据库,列表应自动更新。

您建议如何实现这样的东西?谢谢您的建议。

EN

回答 1

Stack Overflow用户

发布于 2019-04-09 18:49:52

其中一个解决方案是使用observeForever (它不需要生命周期所有者作为param),而不是使用observe。此外,为了避免内存泄漏,我建议删除在onDestroy生命周期方法中使用的Service使用移除观测器创建的观察者。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55597901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档