我们有一个音频应用,我们想为其添加Android Auto功能。该应用程序基本上有一个广播流列表,用户可以选择播放哪一个。
为了获取流,我需要调用Web服务并获取流,而这种情况正在发生,我希望至少在汉堡菜单上显示不确定的进度,就像Spotify在加载内容时所做的那样。
此时,如果我已经下载了流,则在自动调用MediaBrowserServiceCompat
时在onLoadChildren
上填充MediaItems,如果我没有Result<List<MediaBrowserCompat.MediaItem>> result
对象,则我只发送一个空数组MediaItems并调用API,一旦它已经完成后,我在服务上调用了notifyChildrenChanged
,流的列表出现了,但是在那之前,我收到了“No items”消息。
我无法在Android Developer网站上找到一种方法来设置子菜单以显示加载内容,也找不到可以执行此操作的示例应用程序。有谁知道是否有办法,也许在调用onGetRoot
时让Auto知道必须在调用onGetRoot
和onLoadChildren
之前等待吗?我还尝试了调用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/