2016-03-24 11 views
4

まず、他のコードへのリンクを参照するのに適切かどうかわかりませんが、謝罪して、この場合にはもっと適切なメカニズムが何であるか理解したいと思います(これらのリンクは主に利害関係者への参照として提供されている)。webRTCネイティブのAndroidアプリに特定のスレッドモデルが必要です

私たちは、peerconnectionfactoryの処分を呼び出す際に問題になるアンドロイド用のwebrtcネイティブアプリを持っています。ユーザーがアクティブなセッションを終了することを選択すると、ピア接続をクローズして破棄するクリーンアップルーチンがあります(ただしcloseは本当に必要ではありませんが、disposeへの呼び出しも他のリソースを解放する前に接続を閉じる - ストリームやネイティブ・オブザーバなど - libjingle-talk/app/webrtc/java/src/org/webrtc/PeerConnection.javaを参照してください)。私たちの場合、peerconnectionfactoryの作成は、実行可能ファイルを介して作成されたスレッドによって実行されますが、ファクトリの処分はメインUIスレッドから実行されます。

これは問題に遭遇するところです。つまり、peerconnectionfactoryを処分しようとするとアプリがクラッシュします。

webRTCデモコード(https://chromium.googlesource.com/external/webrtc/+/master/webrtc/examples/androidapp/src/org/appspot/apprtcを参照)に関連する投稿のレビューでは、この問題は発生していないようです。

また、ピア接続ファクトリ実装(peerconnectionfactory.ccのhttps://code.google.com/p/chromium/codesearch#chromium/src/third_party/webrtc/api/peerconnectionfactory.ccを参照)のネイティブコードを確認すると、ピア接続ファクトリデストラクタのワーカースレッドのアンラッピングと削除が確認できます。

さらに、chromium webrtcの問題リストをレビューすると、使用時に使用されるスレッディング/ループモデルに関連して特別な注意が必要であると信じるいくつかの問題(例:https://bugs.chromium.org/p/webrtc/issues/detail?id=3100または4196)がありますピアコネクションファクトリー。

私の基本的な質問は、それが配置されているスレッドとは別のスレッドからpeerconnectionfactoryを作成するときや、peerconnectionfactoryを管理するための特定のスレッド/ループ要件セットがあるかどうかという問題です。

おかげで、だから、

答えて

3

は、それは私がコードなどを通じてトレース伝えることができる最高に、スレッドは問題ではなかったことが判明...問題は、私たちが実現し、単一のプライベートクラスを持っていたことでしたSDPObserver、PCObserver、およびDataObserverを他のロジックと一緒に使用します。

この結果、ピア接続が初期化されたとき、オブザーバ(およびその他のロジック)を実装したクラスがオブザーバとして渡され、libjingleのネイティブオブザーバとして記録されたpeerconnectionの処理を呼び出すと、ネイティブオブザーバが解放され、PCObserverが解放されるだけでなく(libjingle peerconnection.dispose())、私たちにとっては同じクラスですべてが解放されました。他のクラスがまだそこにいると思われたときのクラッシュ。

したがって、オブザーバーごとに別々のプライベートクラスで再加工し、適切なオブザーバーだけをピア接続作成(および異なる呼び出しに応じてsdp/data observer)に正しく渡してから、すべての処理を行います。いいね。

関連する問題