mediasource uri 不可用时如何处理 exoplayer2 异常?

how to handle exoplayer2 exception when mediasource uri is unavailable?

我正在使用 Exoplayer 2.11.* 在 Android 上制作音频流应用程序。音频托管在远程服务器上,流式传输使用 Icecast 完成。 问题是,服务器有时会宕机,当用户打开应用程序时,我想对此表示敬意。起初,我是这样做的:

final ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();

DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(
                getContext(),
                Util.getUserAgent(getContext(), "SUSTCast"),
                defaultBandwidthMeter);

Mediasource mediaSource = new ExtractorMediaSource(
                Uri.parse(iceURL),
                dataSourceFactory,
                extractorsFactory,
                new Handler(), error -> {
                 //shows a toast here
                }
        );

但在这种方式下,toast 显示了 3-4 次,因为我认为 exoplayer 会尝试重新加载 URI。或者,我也尝试使用 try/catch 块来解决此问题……但那只是无法捕获错误。谁能告诉我我还能尝试什么或者我在这里做错了什么? 这是在服务器关闭状态期间抛出的异常的堆栈跟踪:

ExoPlayerImplInternal: Source error.
    com.google.android.exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code: 404
        at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:300)
        at com.google.android.exoplayer2.upstream.DefaultDataSource.open(DefaultDataSource.java:177)
        at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
        at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:956)
        at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:761)

您应该使用附加到 exoplayer 本身的事件侦听器来处理错误。

exoPlayer.addListener(object: Player.EventListener {
                        override fun onPlayerError(error: ExoPlaybackException) {
                            super.onPlayerError(error)
                            //show toast
                        }
                    })