сделать цикл запросов в котлине с обратными вызовами и возвращенными объектами - PullRequest
0 голосов
/ 21 мая 2019

Я использую 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
    }

метод, использующий обратные вызовы для извлечения данных, но проблема в том, что он будет возвращаться раньшеобратный вызов завершен, и это всегда также вызывает проблему времени ожидания сокета

Может кто-нибудь посоветовать?

...