我有这种方法需要在后台运行。
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()
上编写代码,但我确实想知道是否可以使代码更小或更容易理解。
答案 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
界面将代码保持在所需的位置。