如何为已经异步的调用运行doAsync?

时间:2019-02-10 06:43:17

标签: android kotlin anko

我有这种方法需要在后台运行。

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()的回调中了?

Anko或Kotlin可以让我做这样的事情吗?伪代码

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

我为什么要这样做?因为尽管我可以在onConnected()上编写代码,但我确实想知道是否可以使代码更小或更容易理解。

2 个答案:

答案 0 :(得分:0)

  

Anko或Kotlin可以让我做这样的伪代码吗?

否,因为connect()的方法GoogleApiClient不返回任何内容!

GoogleApiClient取决于您通过addConnectionCallbacks()实现的回调方法

其他方法

您可以在addConnectionCallbacks中将其添加为匿名类,而不是实现为Class

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()
}
}

答案 1 :(得分:0)

这并不是要使代码更短,我想这将使您的代码更易于遵循。如果要在与GoogleApiClient连接后执行某些操作,则需要在api在onConnected中建立连接之后执行此操作,就像已经完成的那样。因此,如果您尝试在connect调用之后编写一些代码,并且希望在调用connect函数时将其冻结,那么这将导致您的ANR android应用程序。

但是,如果希望runOnUiThread调用立即在主UI线程中运行,则可以使用connect。您也可以使用Runnable界面将代码保持在所需的位置。