2017-08-14 66 views
1

我的咖啡怠速資源不工作 - 它編譯和運行,但不再等待足夠長的時間從'網絡返回結果。你怎麼得到一個Idlingresource工作在Kotlin與協程


  1. 開始https://github.com/chiuki/espresso-samples/tree/master/idling-resource-okhttp
  2. 轉換的主要活動科特林 - 測試(這仍然是在Java)仍然OKHttpIdlingResource工作
  3. 轉換爲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!! 
 

 
    } 
 
}

回答

0

Convert to anko coroutine call instead of retrofit.enqueue - test no longer works.

retrofit.enqueue使用OkHttp的調度。這就是「空閒資源okhttp」識別並傳達給閒置資源管理器的內容。

但是通過使用retrofit.execute和安口的bg您使用的是不同的執行機構,該idlingresource經理不知道,所以雖然它可能被執行的應用程序從管理者的角度閒置,從而結束了測試。

要解決這個問題,你需要註冊任何執行機制bg用途的IdlingResource,所以當有事情發生在執行線程它可以識別。

+0

「無論什麼執行機制BG使用」 - 這是當然的問題。不幸的是,我們使用的是Follestad材質對話框而不是DialogFragment,因此我們不能輕鬆(afaik)檢查dialogfragment的存在(例如進度對話框) – nAndroid

0

您必須創建一個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) { 
     ... 
    } 
    ... 
} 
相關問題