Android - 无法通过多次调用 queueInsertItems() 添加到 RemoteMediaPlayer 队列
Android - Unable to add to RemoteMediaPlayer queue by calling queueInsertItems() multiple times
我正在使用 CastCompanionLibrary 通过从 VideoCastManager.java 调用 queueInsertItems() 将项目添加到 RemoteMediaPlayer 队列,如下所示:
queueInsertItems(unique_items, MediaQueueItem.INVALID_ITEM_ID,
customData);
前几个请求通过,但几次后,我开始收到 TransientNetworkDisconnectionException 和所有后续请求 return status code 2103 (REPLACED)。此时,我无法再将项目添加到我的媒体队列,直到我断开连接并重新连接回投射设备。
这是我的副本 logcat:
01-28 00:24:56.750 7185-7185/com.google.sample.cast.myplayer D/ccl_VideoCastManager: [v2.7.1] > queueInsertItems returned. Status code: 2103
01-28 00:24:56.789 455-469/? I/SurfaceFlinger: id=5534(5) createSurf 0x41449a94 (1x1),1 flag=4, Uoast
01-28 00:24:56.805 463-1700/? D/PowerManagerService: [api] acquire WakeLock flags=0x2000000a > tag=WindowManager uid=1000 pid=463
01-28 00:24:56.891 7185-7189/com.google.sample.cast.myplayer D/dalvikvm: GC_CONCURRE> NT freed > 1843K, 28% free 18679K/25856K, paused 4ms+16ms, total 201ms
01-28 00:24:57.008 28371-12138/? D/CastSocket: [controller-0688 API] IOException encountered. > Tearing down the socket.
java.io.IOException: invalid message size (138391) received.
at com.google.android.gms.cast.c.o.n(SourceFile:457)
at com.google.android.gms.cast.c.o.j(SourceFile:686)
at com.google.android.gms.cast.c.v.b(SourceFile:35)
at com.google.android.gms.cast.c.w.run(SourceFile:103)
at java.lang.Thread.run(Thread.java:856)
01-28 00:24:57.016 28371-12138/? D/CastSocket: [controller-0688 API] shutdown with reason=2
01-28 00:24:57.016 28371-28371/? D/CastDeviceController: [controller-0688 API] onDisconnected; > socketError="2 IO Error"
01-28 00:24:57.023 28371-9680/? D/CastDeviceController: [controller-0688 API] > onSocketDisconnectedInternal: socketError="2 IO Error"
01-28 00:24:57.023 28371-9680/? I/CastDeviceController: [controller-0688 API] finishDisconnecting; > socketError="2 IO Error", mDisconnectStatusCode=SUCCESS
01-28 00:24:57.023 28371-9680/? I/CastDeviceController: [controller-0688 API] listener.> onDisconnected(NETWORK_ERR
我在 logcat 中注意到的一件事是 CastSocket API 由于消息大小无效而以原因 2 不断关闭。我不确定这意味着什么或为什么会这样。但是有人可以解释一下这是怎么回事吗?
提前致谢!
每个 request/api 都使用通用消息传输,并且每个消息都有最大大小;您应该假设有效载荷不能超过 64k,但请记住,一条消息是由一堆东西组成的,它们很容易加起来。您看到的有关无效消息大小的错误让我认为您正在 运行 解决该问题。尝试发送较少的项目。另外请注意,在当前结构下,将 500 个项目的队列分解为 20 条消息,每条消息有 25 个项目是不够的;虽然你可以这样做,但你很快就会 运行 遇到问题,因为你的接收者发送给连接的发送者的所有更新消息也遵循相同的大小限制,所以如果他们需要报告大量的更新消息,他们就会失败物品。考虑到当前的限制,如果您能够以某种方式管理队列,那么在每个时刻,接收者都不会在内存中保存太多项目,同时,它知道如何在需要时从您的(云)后端获取更多项目。您还可以考虑在发送方进行更多管理,以避免将太多队列项推入接收方的队列中,并卸载一些队列项并添加一些新项以保持内存中的总数 low.Finally,尝试尽可能减少您发送给接收者的每件物品的信息;例如,您的接收器可能不需要为某个项目提供所有 fields/metadata,或者给定电视上的 UI 结构,它可能无法显示超过 100 个字符的任何描述, 所以 trim 接收者绝对需要的信息。然后,在发件人端,您可以直接从云中检索关于每个项目的完整 info/metadata,因此如果第二个发件人加入聚会,它从接收者那里获得最少的数据,然后通过进入云来填补空白直接而不是完全依赖接收方可以发送的元数据。
希望对您有所帮助。
我正在使用 CastCompanionLibrary 通过从 VideoCastManager.java 调用 queueInsertItems() 将项目添加到 RemoteMediaPlayer 队列,如下所示:
queueInsertItems(unique_items, MediaQueueItem.INVALID_ITEM_ID, customData);
前几个请求通过,但几次后,我开始收到 TransientNetworkDisconnectionException 和所有后续请求 return status code 2103 (REPLACED)。此时,我无法再将项目添加到我的媒体队列,直到我断开连接并重新连接回投射设备。
这是我的副本 logcat:
01-28 00:24:56.750 7185-7185/com.google.sample.cast.myplayer D/ccl_VideoCastManager: [v2.7.1] > queueInsertItems returned. Status code: 2103
01-28 00:24:56.789 455-469/? I/SurfaceFlinger: id=5534(5) createSurf 0x41449a94 (1x1),1 flag=4, Uoast
01-28 00:24:56.805 463-1700/? D/PowerManagerService: [api] acquire WakeLock flags=0x2000000a > tag=WindowManager uid=1000 pid=463
01-28 00:24:56.891 7185-7189/com.google.sample.cast.myplayer D/dalvikvm: GC_CONCURRE> NT freed > 1843K, 28% free 18679K/25856K, paused 4ms+16ms, total 201ms
01-28 00:24:57.008 28371-12138/? D/CastSocket: [controller-0688 API] IOException encountered. > Tearing down the socket.
java.io.IOException: invalid message size (138391) received.
at com.google.android.gms.cast.c.o.n(SourceFile:457)
at com.google.android.gms.cast.c.o.j(SourceFile:686)
at com.google.android.gms.cast.c.v.b(SourceFile:35)
at com.google.android.gms.cast.c.w.run(SourceFile:103)
at java.lang.Thread.run(Thread.java:856)
01-28 00:24:57.016 28371-12138/? D/CastSocket: [controller-0688 API] shutdown with reason=2
01-28 00:24:57.016 28371-28371/? D/CastDeviceController: [controller-0688 API] onDisconnected; > socketError="2 IO Error"
01-28 00:24:57.023 28371-9680/? D/CastDeviceController: [controller-0688 API] > onSocketDisconnectedInternal: socketError="2 IO Error"
01-28 00:24:57.023 28371-9680/? I/CastDeviceController: [controller-0688 API] finishDisconnecting; > socketError="2 IO Error", mDisconnectStatusCode=SUCCESS
01-28 00:24:57.023 28371-9680/? I/CastDeviceController: [controller-0688 API] listener.> onDisconnected(NETWORK_ERR
我在 logcat 中注意到的一件事是 CastSocket API 由于消息大小无效而以原因 2 不断关闭。我不确定这意味着什么或为什么会这样。但是有人可以解释一下这是怎么回事吗?
提前致谢!
每个 request/api 都使用通用消息传输,并且每个消息都有最大大小;您应该假设有效载荷不能超过 64k,但请记住,一条消息是由一堆东西组成的,它们很容易加起来。您看到的有关无效消息大小的错误让我认为您正在 运行 解决该问题。尝试发送较少的项目。另外请注意,在当前结构下,将 500 个项目的队列分解为 20 条消息,每条消息有 25 个项目是不够的;虽然你可以这样做,但你很快就会 运行 遇到问题,因为你的接收者发送给连接的发送者的所有更新消息也遵循相同的大小限制,所以如果他们需要报告大量的更新消息,他们就会失败物品。考虑到当前的限制,如果您能够以某种方式管理队列,那么在每个时刻,接收者都不会在内存中保存太多项目,同时,它知道如何在需要时从您的(云)后端获取更多项目。您还可以考虑在发送方进行更多管理,以避免将太多队列项推入接收方的队列中,并卸载一些队列项并添加一些新项以保持内存中的总数 low.Finally,尝试尽可能减少您发送给接收者的每件物品的信息;例如,您的接收器可能不需要为某个项目提供所有 fields/metadata,或者给定电视上的 UI 结构,它可能无法显示超过 100 个字符的任何描述, 所以 trim 接收者绝对需要的信息。然后,在发件人端,您可以直接从云中检索关于每个项目的完整 info/metadata,因此如果第二个发件人加入聚会,它从接收者那里获得最少的数据,然后通过进入云来填补空白直接而不是完全依赖接收方可以发送的元数据。
希望对您有所帮助。