Модифицируйте первый запрос с потоком пользовательского интерфейса для отдельных блоков.Ниже приведен соответствующий код и текст:
RetrofitProvider
object RetrofitProvider {
private val TAG: String = RetrofitProvider::class.java.simpleName
val retrofit: Retrofit by lazy {
val httpClient = OkHttpClient.Builder()
.addInterceptor {
val request = it.request()
if (BuildConfig.DEBUG) {
Log.d(TAG, "${request.method()}: ${request.url()}")
}
it.proceed(request)
}
.build()
Retrofit.Builder()
.client(httpClient)
.baseUrl("http://192.168.0.10:3000")
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.addConverterFactory(JacksonConverterFactory.create(jacksonObjectMapper()))
.build()
}
}
ProductApi
interface ProductApi {
@GET("/products")
fun getProducts(): Single<List<Product>>
}
MainViewModel
fun fetchProducts() {
productData.value = Resource.Loading()
productApi.getProducts() // <- This call is a problem (even when I comment out all code below)
.subscribeOn(Schedulers.io())
.subscribe(
{
productData.postValue(Resource.Success(it))
},
{
productData.postValue(Resource.Fail(it.message))
})
.addTo(disposableContainer)
}
MainFragment
...
button.setOnClickListener {
Toast.makeText(requireContext(), "click", Toast.LENGTH_SHORT).show()
mainViewModel.fetchProducts()
}
...
Поток приложений прост, нажатие кнопки на MainFragment вызывает метод fetchProducts () MainViewModel, который использует модификацию для извлечения некоторых вещей.
productApi.getProducts () происходит в потоке пользовательского интерфейса изначительно блокирует его (~ полсекунды), даже тост задерживается, хотя он должен отображаться сразу после нажатия кнопки, прежде чем getProducts () вызов.
productApi.getProducts() сам по себе, без подписка не отправляет сетевой запрос (я проверял на стороне сервера), он просто готовит Single.
Важное замечание, задержка НЕ происходит при последующихнажимает на кнопку.Просто в первый раз, я думаю, что создание Single <> - дорогая операция.
Поэтому мой вопрос: почему поток пользовательского интерфейса блокируется при первом запросе, и как мне это исправить, чтобы он не был уродливым или хакерским?.
Также Observable действует так же, но Completable работает намного быстрее, но мне нужны данные, поэтому я не могу использовать Completable.