6

根据Uamp样本,当onPlayFromMediaId被调用时,它与已存储mediaId的列表匹配,如下所示queueitemsiterator

public static int getMusicIndexOnQueue(Iterable<MediaSessionCompat.QueueItem> queue,
         String mediaId) {
    int index = 0;
    for (MediaSessionCompat.QueueItem item : queue) {
        if (mediaId.equals(item.getDescription().getMediaId())) {
            return index;
        }
        index++;
    }
    return -1;
} 

这很好用,除非你的列表中有几千个项目,它的滞后很严重,在这种情况下我有什么办法可以在队列中获取索引?

PS-此代码来自 v1 分支,尽管基于 v2 kotlin 的分支具有相同的概念。

4

1 回答 1

0

没有可用的 API 可以直接让您这样做。因此,您必须构建自己的数据结构。

我创建了一个 MediaId 的 HashMap 作为键,索引作为它的值。这将帮助您更快地获取 QueueItem。那么问题就变成了,何时创建这个 HashMap。当您从设备中获取媒体列表 (QueueItem) 时,我在回调中创建了它。这个想法是在后台创建这个地图。

HashMap<String, Integer> mediaIndexMap = new HashMap<String, Integer>();
int index = 0;
for (MediaSessionCompat.QueueItem item : queue) {
    mediaIndexMap.put(item.getDescription().getMediaId(), index++);
}

希望这个预处理 QueuItem 应该适用于恒定时间查找/获取。

于 2018-12-05T10:55:15.577 回答