ExoPlayer播放失败错误弹窗出现延迟,优化后无改善求助
解决ExoPlayer错误对话框延迟问题
问题根源分析
你遇到的对话框延迟,一方面是代码里手动添加了3秒延迟,另一方面ExoPlayer默认会尝试重试播放,加上网络请求超时设置过长,都会导致错误回调触发偏晚。
具体修复方案
- 移除手动延迟:直接在
onPlayerError回调中触发错误对话框,不要额外添加延迟逻辑。 - 提前绑定监听器:把监听器添加代码移到
player.prepare()之前,确保能捕获到媒体源初始化阶段的错误。 - 缩短网络超时:给
DefaultHttpDataSource设置更短的连接和读取超时,减少网络层面的等待时间。 - 禁用自动重试:如果不需要ExoPlayer自动重试失败的播放请求,直接关闭重试机制,让错误立刻触发回调。
修改后的代码示例
if (channelUrl != null && !channelUrl.isEmpty()) { try { MediaItem mediaItem = MediaItem.fromUri(Uri.parse(channelUrl)); // 配置Http数据源,缩短超时时间 DefaultHttpDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory() .setConnectTimeoutMs(3000) // 连接超时3秒 .setReadTimeoutMs(5000); // 读取超时5秒 HlsMediaSource hlsMediaSource = new HlsMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem); // 提前添加监听器,避免错过早期错误 player.addListener(new Player.Listener() { @Override public void onPlayerError(@NonNull PlaybackException error) { Log.e("ExoPlayer", "Error playing media: " + error.getMessage()); // 立刻显示错误对话框 showAlertDialogError(); player.stop(); } }); player.setMediaSource(hlsMediaSource); player.prepare(); player.setPlayWhenReady(true); } catch (Exception e) { e.printStackTrace(); // 捕获初始化阶段的异常,直接显示错误 showAlertDialogError(); } }
额外优化:关闭自动重试
如果希望错误发生时立刻触发回调,不需要ExoPlayer重试,可以在创建Player时配置重试策略:
// 创建Player时禁用重试 DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(context) .setEnableDecoderFallback(false); // 关闭解码器降级重试 ExoPlayer player = new ExoPlayer.Builder(context) .setRenderersFactory(renderersFactory) .setRetryPolicy(new DefaultRetryPolicy(0, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)) // 0次重试 .build();
内容的提问来源于stack exchange,提问作者Shanta Kumar das
相关产品推荐
相关产品推荐

