как использовать Coroutine в kotlin для вызова функции каждую секунду - PullRequest
0 голосов
/ 13 марта 2020

Я только что создал приложение, в котором моя функция getdata () вызывает каждую секунду для получения новых данных с сервера, а функция updateui () обновляет представление в пользовательском интерфейсе. Я не использую в своем приложении асинхронную операцию или сопрограмму. Я хочу сделать это пожалуйста, скажите мне, как я могу это сделать.

вот мой код ...

private fun getdata(){
        try {
            val api = RetroClient.getApiService()
            call = api.myJSON
            call!!.enqueue(object : Callback<ProductResponse> {
                override fun onResponse(
                    call: Call<ProductResponse>,
                    response: Response<ProductResponse>
                ) {
                    if (response.isSuccessful) {
                        productList = response.body()!!.data
                        for (list in productList) {
                            if (list.BB.equals("AAA")) {
                                aProductList.add(list)
                            }
                        }
                        if (recyclerView.adapter != null) {
                            eAdapter!!.updatedata(aProductList)
                        }
                        updateui()
                    }
                }

                override fun onFailure(call: Call<ProductResponse>, t: Throwable) {
                    println("error")
                }
            })
        } catch (ex: Exception) {
        } catch (ex: OutOfMemoryError) {
        }
Handler().postDelayed({
            getdata()
        }, 1000)
}


private fun updateui() {
        try {
            //some code to handel ui
 } catch (e: NumberFormatException) {

        } catch (e: ArithmeticException) {

        } catch (e: NullPointerException) {

        } catch (e: Exception) {

        }
    }

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

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

fun repeatFun(): Job {
    return coroutineScope.launch {  
        while(isActive) {
            //do your network request here
            delay(1000)
        }
    }
}

//start the loop
val repeatFun = repeatRequest()

//Cancel the loop
repeatFun.cancel()
0 голосов
/ 13 марта 2020

Для запуска вашей функции каждую секунду с сопрограммами:

var scope = MainScope()

fun startUpdates() {
    scope.launch {
        while(true) {
            getData()
            delay(1000)
        }
    }
}

fun stopUpdates() {
    scope.cancel()
    scope = MainScope()
}

Это, однако, не очень хорошая идея. Функция будет вызываться через секунду после ее завершения, но поскольку сетевой запрос выполняется асинхронно, это может быть запланировано намного.
Например, если сетевой запрос занимает 5 секунд, он будет запущен еще 4 раза до Первый даже закончен!

Чтобы исправить это, вы должны выполнить сетевой запрос с блокирующим api, а затем использовать сопрограммы для выполнения его в фоновом потоке в функции приостановки.


Но в целом это, вероятно, слишком много, чтобы измениться. Просто поставьте:

Handler().postDelayed({
    getdata()
}, 1000) 

в конце updateui и покончите с этим.
Таким образом, это будет запланировано через одну секунду после его завершения.

...