2

我正在使用 Android 架构组件开发音频应用程序。我有一个服务,它扩展MediaBrowserServiceCompat和一个带有MediaBrowserCompat.

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

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

1) 宋道:

@Query("SELECT * FROM songs ORDER BY name COLLATE UNICODE ASC")
List<Song> getSongs();

服务:

 @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);
 }

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

2) 宋道:

@Query("SELECT * FROM songs ORDER BY name COLLATE UNICODE ASC")
LiveData<List<Song>> getSongs();

服务:

 @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(观察方法的第一个参数)。

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

你建议如何实施这样的事情?提前感谢您的任何建议。

4

1 回答 1

0

解决方案之一是使用observeForever(不需要生命周期所有者作为参数)而不是observe. 此外,我建议在使用removeobserveronDestroy的生命周期方法中删除创建的观察者以避免内存泄漏。Service

于 2019-04-09T18:49:52.757 回答