Я использую SDK с открытым исходным кодом под названием matrix для создания приложения чата
Структура этого запроса - сделать запрос на получение всех объединенных комнат пользователем, этот запрос будет только извлекать roomId, после чего вы должны сделатьеще один вызов для каждого roomId, чтобы получить объект комнаты с помощью API-интерфейса syncRoom, проблема в том, что если у вас есть возможность запустить этот цикл и получить данные без проблем с тайм-аутом или вызвать какие-либо проблемы
, вы можете лучше понять логику кодачем текст
это первый метод
fun getRoomsIds(accessToken: String) {
launch {
getRoomService.getRooms(MATRIX_ROOM_SERVICE_URL + accessToken).await().also {
roomsIdsResponse = Gson().fromJson<RoomsIdsResponse>(it.asJsonObject.toString(), RoomsIdsResponse::class.java)
getRoomsIdsEvent.call()
}
}
}
это модифицированная служба, которая принимает только маркер доступа к сеансу пользователя и возвращает массив строк всех соединенных комнат
издесь есть часть цикла for
it.roomIds?.let { ids ->
for (id in ids) {
viewModel.matrixManager.synchRoom(activity as Context, id)
}
}
, а вот метод syncRoom
fun synchRoom(context: Context, roomId: String): RoomResponse? {
var roomResponse: RoomResponse? = null
val roomSyncCallback = object : ApiCallback<RoomResponse?> {
override fun onSuccess(info: RoomResponse?) {
info?.let {
roomResponse = info
}
}
override fun onUnexpectedError(e: Exception?) {
Log.i("AMIRA222", "onUnexpectedError" + e!!.message)
}
override fun onMatrixError(e: MatrixError?) {
Log.i("AMIRA222", "onMatrixError" + e!!.message)
}
override fun onNetworkError(e: Exception?) {
Log.i("AMIRA222", "onNetworkError" + e!!.message)
}
}
getSession(context).roomsApiClient.initialSync(roomId, roomSyncCallback)
return roomResponse
}
метод, использующий обратные вызовы для извлечения данных, но проблема в том, что он будет возвращаться раньшеобратный вызов завершен, и это всегда также вызывает проблему времени ожидания сокета
Может кто-нибудь посоветовать?