我们有一个音频应用,我们想为其添加Android Auto功能。该应用程序基本上有一个广播流列表,用户可以选择播放哪一个。

为了获取流,我需要调用Web服务并获取流,而这种情况正在发生,我希望至少在汉堡菜单上显示不确定的进度,就像Spotify在加载内容时所做的那样。

此时,如果我已经下载了流,则在自动调用MediaBrowserServiceCompat时在onLoadChildren上填充MediaItems,如果我没有Result<List<MediaBrowserCompat.MediaItem>> result对象,则我只发送一个空数组MediaItems并调用API,一旦它已经完成后,我在服务上调用了notifyChildrenChanged,流的列表出现了,但是在那之前,我收到了“No items”消息。

我无法在Android Developer网站上找到一种方法来设置子菜单以显示加载内容,也找不到可以执行此操作的示例应用程序。有谁知道是否有办法,也许在调用onGetRoot时让Auto知道必须在调用onGetRootonLoadChildren之前等待吗?我还尝试了调用API,然后调用了自己的onGetRoot,但没有成功。

提前致谢。

最佳答案

OnGetRoot应该立即返回,因为它实际上不包含任何内容。

尽管onLoadChildren是加载内容的位置,并且它支持任何内容级别的异步加载。提取流时,请不要在调用API前发送空数组的MediaItems。而是从onLoadChildren()中获取流。调用results.detach(),获取另一个线程中的流,然后在内容可用时调用result.sendResult。媒体内容浏览器将在等待异步sendResult调用时显示进度条

这样的事情将解决问题。

@Override
public void onLoadChildren(@NonNull final String parentMediaId, @NonNull final Result<List<MediaItem>> result) {
    if (/* if music library is ready, return immediately */) {
        result.sendResult(getChildren(parentMediaId, getResources()));
    } else {
        // otherwise, return results when the streams are ready
        result.detach();
        someMusicProvider.retrieveMediaAsync(new MusicProvider.Callback() {
            @Override
            public void onStreamsReady(boolean success) {
                result.sendResult(...);
            }
        });
    }
}

关于android - 自动: Showing the progress while doing a background call,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53211708/

10-11 12:16