我们有一个音频应用,我们想为其添加Android Auto功能。该应用程序基本上有一个广播流列表,用户可以选择播放哪一个。
为了获取流,我需要调用Web服务并获取流,在这种情况下,我希望至少在汉堡菜单上显示不确定的进度,就像Spotify在加载内容时所做的那样。
此刻,如果我已经下载了流,则在自动调用MediaBrowserServiceCompat
我的onLoadChildren
对象的Result<List<MediaBrowserCompat.MediaItem>> result
上填充MediaItems,如果我没有它们,只需发送一个空数组MediaItems并调用API,一旦完成,我就在服务上调用notifyChildrenChanged
并显示流列表,但是直到那时我都会收到“无项目”消息。
我无法在Android Developer网站上找到一种方法来设置子菜单以显示加载内容,也找不到可以执行此操作的示例应用程序。是否有人知道有没有办法,也许是在调用onGetRoot
时让Auto知道必须在调用onGetRoot
和onLoadChildren
之前等待吗?我还尝试了调用API,然后调用了自己onGetRoot
,但没有用。
谢谢。
答案 0 :(得分:1)
OnGetRoot应该立即返回,因为它实际上不包含任何内容。
虽然onLoadChildren是加载内容的来源,它支持任何内容级别的异步加载。提取流时,在调用API之前,请勿发送空数组的MediaItem。而是从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(...);
}
});
}
}
答案 1 :(得分:0)
使用ProgressBar是您的答案吗?只需将视图添加到所需的任何布局中
<ProgressBar
id=“progressBar”
width=“wrap_view”
height=“wrap_view”
android:indeterminate=“true”
android:centreInParent=“true”
visibility=“gone” />
因此,一旦在布局中添加了该对象,请添加一个ProgressBar对象并将其分配给oNCreateView()
progressBar = findViewById(R.id.progressBar);
以及在开始通话请求时
progressBar.setVisibility(VISIBLE);
然后在该Web服务的回调中(如果您没有,我建议您创建一个快速的“成功/失败”回调),只需调用
progressBar.setVisibility(GONE);