自动:在进行后台通话时显示进度

时间:2018-11-08 16:10:13

标签: android android-auto

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

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

此刻,如果我已经下载了流,则在自动调用MediaBrowserServiceCompat我的onLoadChildren对象的Result<List<MediaBrowserCompat.MediaItem>> result上填充MediaItems,如果我没有它们,只需发送一个空数组MediaItems并调用API,一旦完成,我就在服务上调用notifyChildrenChanged并显示流列表,但是直到那时我都会收到“无项目”消息。

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

谢谢。

2 个答案:

答案 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);