gpt4 book ai didi

android - 在 MediaBrowserServiceCompat 中从 Room 加载项目

转载 作者:行者123 更新时间:2023-11-29 02:21:03 25 4
gpt4 key购买 nike

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

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

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

1)SongsDAO:

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

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

2)SongsDAO:

@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) 提供数据。我想从应用程序的任何位置访问这些歌曲 - 当我添加新歌曲或从 Room 数据库中删除任何歌曲时,列表应该会自动更新。

您建议如何实现这样的功能?提前感谢您的任何建议。

最佳答案

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

关于android - 在 MediaBrowserServiceCompat 中从 Room 加载项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55597901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com