你怎么得到一个Idlingresource工作在Kotlin与协程
问题描述:
我的咖啡怠速资源不工作 - 它编译和运行,但不再等待足够长的时间从'网络返回结果。你怎么得到一个Idlingresource工作在Kotlin与协程
- 开始https://github.com/chiuki/espresso-samples/tree/master/idling-resource-okhttp
- 转换的主要活动科特林 - 测试(这仍然是在Java)仍然OKHttpIdlingResource工作
- 转换为ANKO协同程序调用,而不是retrofit.enqueue的 - 没有测试更长的作品。
这里是MainActivity新代码的全部
import android.app.Activity
import android.os.Bundle
import android.widget.TextView
import kotlinx.coroutines.experimental.android.UI
import kotlinx.coroutines.experimental.async
import org.jetbrains.anko.coroutines.experimental.bg
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
doCallAsync()
}
private fun doCallAsync() = async(UI) {
val user = bg { getUser() }
val name = user.await().name
val nameView = findViewById(R.id.name) as TextView
nameView.text = name;
}
private fun getUser(): User {
val retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(MoshiConverterFactory.create())
.client(OkHttpProvider.getOkHttpInstance())
.build()
val service = retrofit.create(GitHubService::class.java)
val response = service.getUser("chiuki").execute().body()
return response!!
}
}
答
Convert to anko coroutine call instead of retrofit.enqueue - test no longer works.
retrofit.enqueue
使用OkHttp的调度。这就是“空闲资源okhttp”识别并传达给闲置资源管理器的内容。
但是通过使用retrofit.execute
和安口的bg
您使用的是不同的执行机构,该idlingresource经理不知道,所以虽然它可能被执行的应用程序从管理者的角度闲置,从而结束了测试。
要解决这个问题,你需要注册任何执行机制bg
用途的IdlingResource
,所以当有事情发生在执行线程它可以识别。
答
您必须创建一个IdlingResource
来告诉Espresso应用程序当前是否闲置(如Kiskae写的)。用于协程的AFAIK不存在可以告诉你是否有协程运行的中央注册表。
因此,您必须使用CountingIdlingResource
自行跟踪documentation中的建议。这种便利async
添加-wrapper到您的项目:
public fun <T> asyncRes(
idlingResource: CountingIdlingResource,
context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null,
block: suspend CoroutineScope.() -> T
): Deferred<T> = async(context, start, parent) {
try {
idlingResource.increment()
block()
} finally {
idlingResource.decrement()
}
}
添加的CountingIdlingResource
一个实例的活动里面,叫asyncRes
代替async
并传递CountingIdlingResource
。
class MainActivity : Activity() {
// Active coroutine counter
val idlingResource = CountingIdlingResource("coroutines")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
doCallAsync()
}
private fun doCallAsync() = asyncRes(idlingResource, UI) {
...
}
...
}
“无论什么执行机制BG使用” - 这是当然的问题。不幸的是,我们使用的是Follestad材质对话框而不是DialogFragment,因此我们不能轻松(afaik)检查dialogfragment的存在(例如进度对话框) – nAndroid