Мне нужно сделать HTTP-запрос к серверу в цикле.Я решил использовать okHTTP3, потому что нет необходимости создавать потоки вручную и легко работать с cookie (используя PersistentCookieJar).
Вот мой код:
App.kt
class App : Application() {
companion object {
lateinit var cookieJar: ClearableCookieJar
lateinit var okHttpClient: OkHttpClient
}
override fun onCreate() {
super.onCreate()
cookieJar = PersistentCookieJar(SetCookieCache(), SharedPrefsCookiePersistor(applicationContext))
okHttpClient = OkHttpClient.Builder()
.cookieJar(cookieJar) // for session cookies
.build()
}
}
MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getQuery("https://example.com/path")
}
fun getQuery(url: String) {
Log.e("log", "getQuery start")
val request = Request.Builder()
.url(url)
.build()
App.okHttpClient.newCall(request)?.enqueue(object : okhttp3.Callback {
override fun onFailure(call: okhttp3.Call?, e: IOException?) {
Log.e("log", "onFailure " + e?.message)
}
override fun onResponse(call: okhttp3.Call?, response: okhttp3.Response?) {
val resp = response?.body()?.string()
val code = response?.code()
Log.e("log", "onResponse " + code.toString() + " " + resp )
try {
// here getting info from resp
} catch (e: Exception) {
Log.e("log", "catch " + e?.message)
} finally {
getQuery("https://example.com/path") // call in cycle
}
}
})
}
Когда я вызываю getQuery из себя, okHttpClient ничего не делает, logcat не показывает onResponse, не onFailure.Я думаю, это из-за вызова из другого потока, созданного okHttpClient.
Что я делаю не так?