自动:在进行后台调用时显示进度
Auto: Showing the progress while doing a background call
我们有一个音频应用程序,我们想为其添加 Android 自动功能。该应用基本上有一个广播流列表,用户可以select播放哪个。
为了获取流,我需要调用 Web 服务并获取流,当发生这种情况时,我希望至少在汉堡菜单上显示不确定的进度,就像 Spotify 在加载内容时所做的那样。
此时如果我已经下载了流,在我的 MediaBrowserServiceCompat
上当自动调用 onLoadChildren
我的 Result<List<MediaBrowserCompat.MediaItem>> result
对象填充了 MediaItems,如果我没有他们我只是发送一个空的 MediaItems 数组并调用 API,一旦它完成我在服务上调用 notifyChildrenChanged
并且出现流列表,但在那之前我有一个 "No items"留言。
我在 Android 开发者网站上找不到设置子菜单以显示加载的方法,而且我找不到执行此操作的示例应用程序。有谁知道是否有办法,也许当调用 onGetRoot
时让 Auto 知道在调用 onGetRoot
和 onLoadChildren
之前必须等待?我也尝试调用 API 然后调用自己 onGetRoot
但它没有用。
提前致谢。
使用 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);
在该网络服务的回调上(如果你没有,我建议你创建一个快速的“success/failure”回调)只需调用
progressBar.setVisibility(GONE);
OnGetRoot 应该 return 立即,因为它实际上不携带任何内容。
onLoadChildren 虽然是加载内容的地方,但它支持在任何内容级别上进行异步加载。获取流时,在调用 API 之前不要发送空的 MediaItems 数组。相反,从 onLoadChildren() 中获取流。调用 results.detach(),在另一个线程中获取流,然后在内容可用时调用 results.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 自动功能。该应用基本上有一个广播流列表,用户可以select播放哪个。
为了获取流,我需要调用 Web 服务并获取流,当发生这种情况时,我希望至少在汉堡菜单上显示不确定的进度,就像 Spotify 在加载内容时所做的那样。
此时如果我已经下载了流,在我的 MediaBrowserServiceCompat
上当自动调用 onLoadChildren
我的 Result<List<MediaBrowserCompat.MediaItem>> result
对象填充了 MediaItems,如果我没有他们我只是发送一个空的 MediaItems 数组并调用 API,一旦它完成我在服务上调用 notifyChildrenChanged
并且出现流列表,但在那之前我有一个 "No items"留言。
我在 Android 开发者网站上找不到设置子菜单以显示加载的方法,而且我找不到执行此操作的示例应用程序。有谁知道是否有办法,也许当调用 onGetRoot
时让 Auto 知道在调用 onGetRoot
和 onLoadChildren
之前必须等待?我也尝试调用 API 然后调用自己 onGetRoot
但它没有用。
提前致谢。
使用 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);
在该网络服务的回调上(如果你没有,我建议你创建一个快速的“success/failure”回调)只需调用
progressBar.setVisibility(GONE);
OnGetRoot 应该 return 立即,因为它实际上不携带任何内容。
onLoadChildren 虽然是加载内容的地方,但它支持在任何内容级别上进行异步加载。获取流时,在调用 API 之前不要发送空的 MediaItems 数组。相反,从 onLoadChildren() 中获取流。调用 results.detach(),在另一个线程中获取流,然后在内容可用时调用 results.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(...);
}
});
}
}