1

我是 kotlin 和协程的新手。我一直在研究 android 应用程序的客户端-服务器部分。我为此使用了 mediasoup-client-android库。

我正在尝试使用 createSendTransport() 方法初始化 sendtransport。该方法确实有一个 sendTransportListener,它具有抽象方法。其中一个是 onProduce(),它返回一个 producerId,它是一个字符串。awaitEmit() 是一个异步操作,我在 onProduce() 中需要它。要使用 awaitEmit(),我使用了协程。但我需要 String 作为返回类型而不是 Deferred。还有其他方法可以实现上述逻辑吗?下面是我的代码

class RoomClient {
 suspend fun initTransports(device: Device) {
    coroutineScope {
        val id: String?
        val iceParameters: String?
        val iceCandidates: String?
        val dtlsParameters: String?
        val sctpParameters: String?
        try {
            val params = JSONObject()
            params.put("forceTcp",false)
            params.put("rtpCapabilities", this@RoomClient.device?.rtpCapabilities)
            val res = socket?.awaitEmit("createWebRtcTransport",params)
            val data = res?.get(0) as JSONObject
            if (data.has("error")) {
                Log.d(TAG, data.getString("error"))
                return@coroutineScope
            }
            id = data.optString("id")
            iceParameters = data.optString("iceParameters")
            iceCandidates = data.optString("iceCandidates")
            dtlsParameters = data.optString("dtlsParameters")
            sctpParameters = data.optString("sctpParameters")
        } catch (e: Throwable) {
            Log.e(TAG, "${e.message}")
            return@coroutineScope
        }
        val sendTransportListener: SendTransport.Listener = object : SendTransport.Listener {
            private val listenerTAG = TAG.toString() + "_ProducerTrans"
            override fun onProduce(
                transport: Transport,
                kind: String?,
                rtpParameters: String?,
                appData: String?
            ): String? {
                this@coroutineScope.async{
                    var producerId: String? = null
                    Log.d(listenerTAG, "onProduce() ")
                    val producerDeferred = launch {
                    val params = JSONObject("""{"producerTransportId": transport.id, "kind": kind, "rtpParameters": rtpParameters,"appData": appData}""")
                    val res = socket?.awaitEmit("produce",params)
                    val data = res?.get(0) as JSONObject
                    producerId = data.getString("producer_Id")
                    }
                    producerDeferred.join()
                    Log.d(listenerTAG, "producerId inside the coroutine: $producerId"
                    }
                return@async producerId
            }
        }
        this@RoomClient.producerTransport = device.createSendTransport(
            sendTransportListener, id,
            iceParameters,
            iceCandidates,
            dtlsParameters
        )

    }
}

}

而且我不确定这里使用协程的方式。如果我错过了一些核心内容,请纠正我。

4

0 回答 0