Как запустить doAsync для уже асинхронного вызова? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть этот метод, который нужно запустить в фоновом режиме.

override fun doBackground() {
    doAsync {
       val googleClientApi = GoogleApiClient.Builder(context)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build()

        googleClientApi.connect()
    }
}

override fun onConnected(p0: Bundle?) {
    // Result. 
    dowork()
}

Как я могу использовать Anko doAsync, чтобы мне не пришлось разбивать мой код на вызовзадняя часть onConnected()?

Позволяет ли мне Анко или Котлин сделать что-то подобное псевдокод :

override fun doBackground() {
    doAsync {
        ...
        val connected = googleClientApi.connect()
        continue code execution here instead of on the onConnected()
    }
}

Почему я хочу это сделать?Потому что, хотя я мог бы написать код на onConnected(), мне интересно, смогу ли я сделать код меньше или легче следовать.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Речь идет не о том, чтобы сделать ваш код короче, и я подумал, что это также облегчит выполнение вашего кода.Если вы хотите выполнить что-то после соединения с GoogleApiClient, то вам нужно сделать это после того, как API установит соединение в onConnected, как вы уже сделали.Так что, если вы пытаетесь написать некоторый код сразу после вызова connect, и вы ожидаете, что он будет заморожен во время вызова функции connect, то это вызовет ANR в вашем приложении для Android.

Однако вы можете использовать runOnUiThread, если хотите, чтобы ваш вызов connect выполнялся немедленно в главном потоке пользовательского интерфейса.Вы также можете использовать интерфейс Runnable, чтобы сохранить код в том же месте, где вы хотите.

0 голосов
/ 10 февраля 2019

Позволяет ли мне Анко или Котлин сделать что-то вроде этого псевдокода:

Нет, потому что метод connect() из GoogleApiClient ничего не возвращает !!

GoogleApiClient зависит от методов обратного вызова, которые вы достигаете с помощью addConnectionCallbacks()

Другой подход

Вы можете добавить в качестве анонимного класса вaddConnectionCallbacks вместо реализации в классе

override fun doBackground() {
doAsync {
   val googleClientApi = GoogleApiClient.Builder(context)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(object : ConnectionCallbacks{
              override fun onConnected(bundle: Bundle?) {

              }

              override fun onConnectionSuspended(value: Int) {
              }
            })
            .addOnConnectionFailedListener(this)
            .build()

    googleClientApi.connect()
}
}
...