fix(WebRtcClient): 修复关闭后调用状态引发的异常
This commit is contained in:
@@ -256,7 +256,7 @@ public class WebRtcClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void sendControlCommand(ControlMessage message) {
|
public void sendControlCommand(ControlMessage message) {
|
||||||
if (dataChannel != null && dataChannel.state() == DataChannel.State.OPEN) {
|
if (isDataChannelOpen()) {
|
||||||
DataChannel.Buffer buffer = new DataChannel.Buffer(
|
DataChannel.Buffer buffer = new DataChannel.Buffer(
|
||||||
ByteBuffer.wrap(message.toByteArray()), false);
|
ByteBuffer.wrap(message.toByteArray()), false);
|
||||||
dataChannel.send(buffer);
|
dataChannel.send(buffer);
|
||||||
@@ -269,7 +269,7 @@ public class WebRtcClient {
|
|||||||
* fps <= 0 表示沿用当前帧率。
|
* fps <= 0 表示沿用当前帧率。
|
||||||
*/
|
*/
|
||||||
public void requestResolutionChange(int width, int height, int fps) {
|
public void requestResolutionChange(int width, int height, int fps) {
|
||||||
if (dataChannel != null && dataChannel.state() == DataChannel.State.OPEN) {
|
if (isDataChannelOpen()) {
|
||||||
ControlMessage msg = ControlMessage.newBuilder()
|
ControlMessage msg = ControlMessage.newBuilder()
|
||||||
.setAction(Action.SET_RESOLUTION)
|
.setAction(Action.SET_RESOLUTION)
|
||||||
.setWidth(width)
|
.setWidth(width)
|
||||||
@@ -283,21 +283,28 @@ public class WebRtcClient {
|
|||||||
public void close() {
|
public void close() {
|
||||||
if (remoteVideoTrack != null && remoteSurfaceView != null) {
|
if (remoteVideoTrack != null && remoteSurfaceView != null) {
|
||||||
remoteVideoTrack.removeSink(remoteSurfaceView);
|
remoteVideoTrack.removeSink(remoteSurfaceView);
|
||||||
|
remoteVideoTrack = null;
|
||||||
}
|
}
|
||||||
if (dataChannel != null) {
|
if (dataChannel != null) {
|
||||||
|
try { dataChannel.unregisterObserver(); } catch (Exception ignored) {}
|
||||||
dataChannel.close();
|
dataChannel.close();
|
||||||
dataChannel.dispose();
|
dataChannel.dispose();
|
||||||
|
dataChannel = null;
|
||||||
}
|
}
|
||||||
if (videoDataChannel != null) {
|
if (videoDataChannel != null) {
|
||||||
|
try { videoDataChannel.unregisterObserver(); } catch (Exception ignored) {}
|
||||||
videoDataChannel.close();
|
videoDataChannel.close();
|
||||||
videoDataChannel.dispose();
|
videoDataChannel.dispose();
|
||||||
|
videoDataChannel = null;
|
||||||
}
|
}
|
||||||
if (peerConnection != null) {
|
if (peerConnection != null) {
|
||||||
peerConnection.close();
|
peerConnection.close();
|
||||||
peerConnection.dispose();
|
peerConnection.dispose();
|
||||||
|
peerConnection = null;
|
||||||
}
|
}
|
||||||
if (peerConnectionFactory != null) {
|
if (peerConnectionFactory != null) {
|
||||||
peerConnectionFactory.dispose();
|
peerConnectionFactory.dispose();
|
||||||
|
peerConnectionFactory = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,7 +324,12 @@ public class WebRtcClient {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStateChange() {
|
public void onStateChange() {
|
||||||
Log.d(TAG, "DataChannel state: " + dc.state());
|
try {
|
||||||
|
DataChannel.State state = dc.state();
|
||||||
|
Log.d(TAG, "DataChannel state: " + state);
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
Log.w(TAG, "DataChannel state error (already disposed?)");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -348,7 +360,12 @@ public class WebRtcClient {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStateChange() {
|
public void onStateChange() {
|
||||||
Log.d(TAG, "Video DataChannel state: " + dc.state());
|
try {
|
||||||
|
DataChannel.State state = dc.state();
|
||||||
|
Log.d(TAG, "Video DataChannel state: " + state);
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
Log.w(TAG, "Video DataChannel state error (already disposed?)");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -369,7 +386,13 @@ public class WebRtcClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVideoDataChannelOpen() {
|
public boolean isVideoDataChannelOpen() {
|
||||||
return videoDataChannel != null && videoDataChannel.state() == DataChannel.State.OPEN;
|
DataChannel dc = videoDataChannel;
|
||||||
|
if (dc == null) return false;
|
||||||
|
try {
|
||||||
|
return dc.state() == DataChannel.State.OPEN;
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 请求被控端切换屏幕串流模式(WebRTC / 自编码)。 */
|
/** 请求被控端切换屏幕串流模式(WebRTC / 自编码)。 */
|
||||||
@@ -423,6 +446,12 @@ public class WebRtcClient {
|
|||||||
|
|
||||||
/// 控制 DataChannel 是否已打开(用于状态显示)。
|
/// 控制 DataChannel 是否已打开(用于状态显示)。
|
||||||
public boolean isDataChannelOpen() {
|
public boolean isDataChannelOpen() {
|
||||||
return dataChannel != null && dataChannel.state() == DataChannel.State.OPEN;
|
DataChannel dc = dataChannel;
|
||||||
|
if (dc == null) return false;
|
||||||
|
try {
|
||||||
|
return dc.state() == DataChannel.State.OPEN;
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user