あなたに頻繁にあなたが望むようExoPlayer.seekTo()を呼び出すことができ、それが(以前seekToをキャンセル処理する必要があります)、彼らが終了していない場合に要求?あるいは、私たちはseekTo()が自分自身を呼び出すのを防ぐ必要がありますか?
私はできると思います。
NOT前回の検索要求をキャンセルします。 実際、少なくとも3つのスレッドがシークプロセスに関与しています。
- アプリケーションスレッド:それはあなたがExoPlayer.seekToを呼び出したスレッドです()。
- 内部再生スレッド:目標位置を設定するスレッドです&内部設定をEXOplayerに内部的に行います。クラスExoPlayerImplInternalのseekToInternal()、seekToPeriodPosition()およびseekToPeriodPosition()など。
- ロードスレッド:load.javaで見つけることができます。ステップ2で内部再生スレッドが設定を完了したら、continueLoading()を呼び出してロード先のスレッドにシーク対象の周辺のターゲットデータをダウンロードさせます。
内部再生スレッドはシーク動作の処理を行った後、それはレンダリング(またはスキップ)するデコードされたフレームがあるかどうかを確認しようとの作用doSomeWorkを配置してもよいです。 最後に、シークターゲットがレンダリングされると、ディスプレイに表示されるシークターゲットの瞬間を見ることができます。
要するに、以前のシークアクション(ExoPlayer.seekTo()など)が対応するメッセージをinternalPlaybackThreadのメッセージキューに送信したときに、次のシークを再度押す(配信する)ことができます。シーク動作はであり、がシリアル化され、内部再生スレッドによって順番に処理されます。
内部再生スレッドがシークメッセージを取得すると、&がそれを処理しました。読み込みスレッドが読み込みを開始します。あなたがダウンロードした場合、demux &は十分速くデコードされ、次のシークの前にdoSomeWorkがあります。シークの結果を見ることができます。 それ以外の場合、次のシークは読み込みを停止します&再度シークします(この場合は、前のシークががキャンセルされたように見えます)です。
結果として、シーク動作と実行シーケンスを内部的にどのくらい速く配信するかによって異なります。