Вы можете сначала преобразовать ApiService.java
в ApiService.kt
в Kotlin:
interface ApiService {
@GET("…")
fun getData ( … : Call<Object>)
}
Чтобы изменить тип возврата методов обслуживания с Call
на Deferred
,Вы можете изменить вышеуказанную строку следующим образом:
fun getData ( … : Deferred<Object>)
Чтобы настроить запрос на анализ ответа на модификацию в Kotlin, вы можете уменьшить его до нескольких строк в Kotlin.
В вашем onCreate()
в override fun onCreate(savedInstanceState: Bundle?){
в MainActivity.kt
:
val retrofit = Retrofit.Builder()
// Below to add Retrofit 2 ‘s Kotlin Coroutine Adapter for Deferred
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.baseUrl(“YOUR_URL”)
.build()
val service = retrofit.create(ApiService::class.java)
// Above using :: in Kotlin to create a class reference/ member reference
val apiOneTextView = findViewById<TextView>(R.id.api_one_text_view)
// to convert cast to findViewById with type parameters
Я не знаю сценарий использования вашего API, но если ваш API собирается возвращать длинный текстовый блок, вы также можете рассмотреть возможность использования предложенного подхода в нижней части этого поста.
Я включил подход для передачи вычисления текста в PrecomputedTextCompat.getTextFuture
, который согласно документации Android является помощником для PrecomputedText
, который возвращает будущее, которое будет использоваться с AppCompatTextView.setTextFuture(Future)
.
Опять же, внутри вашего MainActivity.kt
:
// Set up a Coroutine Scope
GlobalScope.launch(Dispatchers.Main){
val time = measureTimeMillis{
// important to always check that you are on the right track
try {
initialiseApiTwo()
initialiseApiThree()
val createRequest = service.getData(your_params_here)
apiOneTextView.text=”Your implementation here with api details using ${createRequest.await().your_params_here}”
} catch (exception: IOException) {
apiOneTextView.text=”Your network is not available.”
}
}
println(“$time”)
// to log onto the console, the total time taken in milliseconds taken to execute
}
Отложено + Ожидание = приостановить до ожидания результата, неблокировать основной поток пользовательского интерфейса
Для ваших
initializeApiTwo()
&
initializeApiThree()
вы можете использовать для них
private suspend fun
, используя аналогичные
GlobalScope.launch(Dispatchers.Main){
... &
val createRequestTwo = initializeApiTwo()
, где:
private suspend fun initializeApiTwo() = withContext(Dispatchers.Default) {
// объем сопрограммы и следуя тому жеподход, изложенный в пункте 2 обсуждения.
Когда я использовал описанный выше метод, моя реализация заняла 1863ms .
Для дальнейшей оптимизации этого метода (от последовательного к параллельному), вы можете добавить следующие модификации желтым цветом, чтобы перейти к Одновременный , используя Асинхронный (тот же код из точкиобсуждение 4.), которое в моем случае дало 50% улучшения времени и длительность сокращения до 901мс .
Согласно документации Kotlin, Async возвращает Отложено - легкое неблокирующее будущее, которое представляет собой обещание предоставить результат позже.Вы можете использовать .await () для отложенного значения, чтобы получить конечный результат.
Внутри MainActivity.kt
:
// Set up a Coroutine Scope
GlobalScope.launch(Dispatchers.Main){
val time = measureTimeMillis{
// important to always check that you are on the right track
try {
val apiTwoAsync = async {initialiseApiTwo ()}
val apiThreeAsync = async {initialiseApiThree ()}
val createRequest= async {service.getData (your_params_here)} *
val dataResponse = createRequest.await ()
apiOneTextView.text = ”Ваша реализация здесь с деталями API с использованием $ {dataResponse.await (). your_params_here} ”
} catch (exception: IOException) {
apiOneTextView.text=”Your network is not available.”
}
}
println(“$time”)
// to log onto the console, the total time taken in milliseconds taken to execute
}
Чтобы узнать больше о создании функций приостановки в этом разделе, вы можете посетить этот раздел на Одновременно с использованием Async , предоставленнойДокументация Котлина здесь .
Предлагаемый подход для обработки PrecomputedTextCompat.getTextFuture
:
if (true) {
(apiOneTextView as AppCompatTextView).setTextFuture(
PrecomputedTextCompat.getTextFuture(
apiOneTextView.text,
TextViewCompat.getTextMetricsParams(apiOneTextView), null)
)
}
Надеюсь, что это полезно.