рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреЛрд░рдЬрд╛рдЗрдВрд╕ рдХреЗ рд╕рд╛рде RxJava рдХреЛ рдХреИрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ RxJava рдХреЗ рдмрдЬрд╛рдп рдХреЛрдЯрд▓рд┐рди рдХреЙрд░рдЖрдЙрдЯреНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкрд╛рдЙрд▓реЛ рд╕рд╛рддреЛ рдХреЗ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред

RxJava рдПрдХ bazooka рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЗрд╕рдХреА рдорд╛рд░рдХ рдХреНрд╖рдорддрд╛ рдХрд╛ рдЖрдзрд╛ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА рдХрд┐ рдЗрд╕реЗ рдХреЛрдЯрд▓рд┐рди рдХреЛрд░рдЯрд╛рдЗрдиреНрд╕ (рдХреЛрд░рдЯрд╛рдЗрди) рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдореИрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ RxJava рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬреЛ рдЖрдЬ рднреА рд╕рджрдореЗ рдореЗрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдЬрд╛рд╡рд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреЛрдЯрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╢рд╣рд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рд╢реЗрд░рд┐рдл рд╣реИред

рдЬреНрдпрд╛рджрд╛рддрд░ RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреЙрд▓рдмреИрдХ рдирд░рдХ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рддреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдФрд░ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдорд╛рдиреЗрдВ)ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ RxJava рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢рдХреНрддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдмреИрдХрд╕реНрдкреЗрд╕ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдордХрдбрд╝реА рдХреЛ рдорд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЬрд╝реВрдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдУрд╡рд░рдХрд┐рд▓ рд╣реИред

RxJava рдХреА рдПрдХ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдХрдореА рддрд░реАрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдкреВрд░реЗ рдХреЛрдб рдореЗрдВ рдлреИрд▓ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдЯрд▓рд┐рди рдореЗрдВ, рдЖрдк RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди ... рдХреЛрд░рдЯрд╛рдЗрди рдХреНрдпрд╛ рд╣реИрдВ?

Corutin рдПрдХ рд╕реВрддреНрд░ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдереНрд░реЗрдб рддрдм рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдЗрд╕реЗ рд░реЛрдХрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдереНрд░реЗрдб рдмрдирд╛рдП рдмрд┐рдирд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред
рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЕрднреА рднреА рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреЛрдЯрд▓рд┐рди 1.3 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ рдпреВрд╕реЗрдЬ рдХреИрд╢реЗ (рд╕реНрд╡рдЪреНрдЫ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП) рдХреНрд▓рд╛рд╕ рдХреЗ рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рдерд╛ рдЬреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ coroutine рдХреЙрд▓ рдХрд┐рд╕реА рдПрдХрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдиреНрдп рдкрд░рддреЗрдВ, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдХреЛрд░рд╛рдЙрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рдФрд░ рдЕрдзрд┐рдХ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯреЗрдб рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреАред

/** * (C) Copyright 2018 Paulo Vitor Sato Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.psato.devcamp.interactor.usecase import android.util.Log import kotlinx.coroutines.experimental.* import kotlinx.coroutines.experimental.android.UI import kotlin.coroutines.experimental.CoroutineContext /** * Abstract class for a Use Case (Interactor in terms of Clean Architecture). * This interface represents a execution unit for different use cases (this means any use case * in the application should implement this contract). * <p> * By convention each UseCase implementation will return the result using a coroutine * that will execute its job in a background thread and will post the result in the UI thread. */ abstract class UseCase<T> { protected var parentJob: Job = Job() //var backgroundContext: CoroutineContext = IO var backgroundContext: CoroutineContext = CommonPool var foregroundContext: CoroutineContext = UI protected abstract suspend fun executeOnBackground(): T fun execute(onComplete: (T) -> Unit, onError: (Throwable) -> Unit) { parentJob.cancel() parentJob = Job() launch(foregroundContext, parent = parentJob) { try { val result = withContext(backgroundContext) { executeOnBackground() } onComplete.invoke(result) } catch (e: CancellationException) { Log.d("UseCase", "canceled by user") } catch (e: Exception) { onError(e) } } } protected suspend fun <X> background(context: CoroutineContext = backgroundContext, block: suspend () -> X): Deferred<X> { return async(context, parent = parentJob) { block.invoke() } } fun unsubscribe() { parentJob.cancel() } } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдПрдХ рдореВрд▓ рдХрд╛рд░реНрдп рдмрдирд╛рдпрд╛ред рдпрд╣ рдЙрди рд╕рднреА рдХреЛрд░рдЖрдЙрдЯреЛрдВ рдХреЛ рдкреВрд░реНрд╡рд╡рддреН рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рд╣реИ рдЬреЛ UseCase рдХреНрд▓рд╛рд╕ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдереЗред рдЬрдм рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рд╣рдо рдПрдХ рднреА рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рдпрд╛рдж рди рдХрд░реЗрдВ (рдпрд╣ рддрдм рднреА рд╣реЛрдЧрд╛ рдЬрдм рд╣рдо рдЗрд╕ UseCase рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ)ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк (рдпреВрдЖрдИ) рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ рдХреЛрд░рдЯрд╛рдЗрди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдпреВрдЖрдИ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдердб рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдХреЙрдордирдкреВрд▓ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ (рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рд╣реЛрдЧрд╛)ред рдмрджрд▓реЗ рдореЗрдВ, Async рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░, рдореИрдВ рдЗрд╕рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рдХрд╣реВрдВрдЧрд╛ред рд╡рд╣ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдпрд╛ рддреНрд░реБрдЯрд┐ рд▓рд╛рдПрдЧрд╛ред

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо RxJava рдХреЗ рд╕рд╛рде рдХрд┐рдП рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВред

рдирдХреНрд╢рд╛


рдореИрдВрдиреЗ рдЦреЛрдЬ рд╢реЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╢реЛ рдХрд╛ рдирд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рджрд┐рдпрд╛ред
RxJava рдХреЛрдб:
 public class SearchShows extends UseCase { private ShowRepository showRepository; private ResourceRepository resourceRepository; private String query; @Inject public SearchShows(ShowRepository showRepository, ResourceRepository resourceRepository) { this.showRepository = showRepository; this.resourceRepository = resourceRepository; } public void setQuery(String query) { this.query = query; } @Override protected Single<String> buildUseCaseObservable() { return showRepository.searchShow(query).map(showInfos -> { if (showInfos != null && !showInfos.isEmpty() && showInfos.get(0).getShow() != null) { return showInfos.get(0).getShow().getTitle(); } else { return resourceRepository.getNotFoundShow(); } }); } } 

Coroutine рдХреЛрдб:

 class SearchShows @Inject constructor(private val showRepository: ShowRepository, private val resourceRepository: ResourceRepository) : UseCase<String>() { var query: String? = null override suspend fun executeOnBackground(): String { query?.let { val showsInfo = showRepository.searchShow(it) val showName: String? = showsInfo?.getOrNull(0)?.show?.title return showName ?: resourceRepository.notFoundShow } return "" } } 

рдЬрд╝рд┐рдк


рдЬрд┐рдк рдкреНрд░реЗрдХреНрд╖рдХ рд╕реЗ рджреЛ рдЙрддреНрд╕рд░реНрдЬрди рд▓реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирдП рдЙрддреНрд╕рд░реНрдЬрди рдореЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ RxJava рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рдВрдЧрд▓ рдореЗрдВ рд╕рдмрдСрдирдСрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдПрдХ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛрдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

RxJava рдХреЛрдб:

 public class ShowDetail extends UseCase { private ShowRepository showRepository; private String id; @Inject public SearchShows(ShowRepository showRepository) { this.showRepository = showRepository; } public void setId(String id) { this.id = id; } @Override protected Single<Show> buildUseCaseObservable() { Single<ShowDetail> singleDetail = showRepository.showDetail(id).subscribeOn(Schedulers.io()); Single<ShowBanner> singleBanner = showRepository.showBanner(id).subscribeOn(Schedulers.io()); return Single.zip(singleDetail, singleBanner, (detail, banner) -> new Show(detail,banner)); } 

Coroutine рдХреЛрдб:

 class SearchShows @Inject constructor(private val showRepository: ShowRepository, private val resourceRepository: ResourceRepository) : UseCase<Show>() { var id: String? = null override suspend fun executeOnBackground(): Show { id?.let { val showDetail = background{ showRepository.showDetail(it) } val showBanner = background{ showRepository.showBanner(it) } return Show(showDetail.await(), showBanner.await()) } return Show() } } 

FlatMap


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдРрд╕реЗ рд╢реЛ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рдирдореЗрдВ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдгрд╛рдо (200 рдкрд░рд┐рдгрд╛рдореЛрдВ рддрдХ рд╕реАрдорд┐рдд) рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╢реЛ рдХреА рд░реЗрдЯрд┐рдВрдЧ рднреА рдорд┐рд▓рддреА рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рд╕рдВрдмрдВрдзрд┐рдд рд░реЗрдЯрд┐рдВрдЧ рд╡рд╛рд▓реЗ рд╢реЛ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реВрдВред

RxJava рдХреЛрдб:

 public class SearchShows extends UseCase { private ShowRepository showRepository; private String query; @Inject public SearchShows(ShowRepository showRepository) { this.showRepository = showRepository; } public void setQuery(String query) { this.query = query; } @Override protected Single<List<ShowResponse>> buildUseCaseObservable() { return showRepository.searchShow(query).flatMapPublisher( (Function<List<ShowInfo>, Flowable<ShowInfo>>) Flowable::fromIterable) .flatMapSingle((Function<ShowInfo, SingleSource<ShowResponse>>) showInfo -> showRepository.showRating(showInfo.getShow().getIds().getTrakt()) .map(rating -> new ShowResponse(showInfo.getShow().getTitle(), rating .getRating())).subscribeOn(Schedulers.io()), false, 4).toList(); } } 

Coroutine рдХреЛрдб:

 class SearchShows @Inject constructor(private val showRepository: ShowRepository) : UseCase<List<ShowResponse>>() { var query: String? = null override suspend fun executeOnBackground(): List<ShowResponse> { query?.let { query -> return showRepository.searchShow(query).map { background { val rating: Rating = showRepository.showRating(it.show!!.ids!!.trakt!!) ShowResponse(it.show.title!!, rating.rating) } }.map { it.await() } } return arrayListOf() } } 

рдореБрдЭреЗ рд╕рдордЭрд╛рдиреЗ рдХреАред RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореЗрд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реВрдЪреА рдХрд╛ рдПрдХ рдПрдХрд▓ рдЙрддреНрд╕рд░реНрдЬрди рд▓реМрдЯрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХрдИ рдЙрддреНрд╕рд░реНрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ ShowInfo рдХреЗ рд▓рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдлреНрд▓реИрдЯрдкрд╛рдЗрдк рдкрдмреНрд▓рд┐рд╢рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ ShowResponse рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЕрдВрдд рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ: рд╕реВрдЪреА foreach тЖТ (ShowInfo тЖТ ShowRating тЖТ ShowResponse) тЖТ рд╕реВрдЪреАред

Coroutines рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪреА рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪреА <Deffered> рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХреНрд╢рд╛ рдмрдирд╛рдпрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ RxJava рдХреЗ рд╕рд╛рде рдЬреЛ рдХрд┐рдпрд╛, рдЙрд╕рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред Coroutines рднреА рдлреНрд▓реИрдЯрдкрд╛рдЗрдк рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ RxJava рдореЗрдВ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдпрд╣ рд╕рд░реНрд╡рд╡рд┐рджрд┐рдд рд╣реИ рдХрд┐ рдХреЛрд░рдЯрд╛рдЗрди рд╣рд▓реНрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ( рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ), рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдиреЗ рдореБрдЭреЗ рд╣реИрд░рд╛рди рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, RxJava рдиреЗ рд▓рдЧрднрдЧ 3.1 рд╕реЗрдХрдВрдб рдореЗрдВ рд╢реБрд░реБрдЖрдд рдХреА, рдЬрдмрдХрд┐ рдХреЙрд░рдЯреАрди рдиреЗ рдХреЙрдордирдкреВрд▓ рдкрд░ рдЪрд▓рдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 5.8 рд╕реЗрдХрдВрдб рдХрд╛ рд╕рдордп рд▓рд┐рдпрд╛ред

рдЗрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдиреЗ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рд╕рд╡рд╛рд▓ рдЙрдард╛рдпрд╛ рдХрд┐ рдЙрдирдореЗрдВ рдХреБрдЫ рдЕрдиреБрдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ, рдореИрдВрдиреЗ рдпрд╣ рдкрд╛рдпрд╛ред рдореИрдВрдиреЗ рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЧрдпрд╛ред

рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рдЪреБрдирд╛рд╡ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ 3.1 рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдХреЛ рд░реЛрдХ рдирд╣реАрдВ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди 'ru.gildor.coroutines: kotlin-coroutines-retrofit: 0.12.0'

рдпрд╣ рдХреЛрдб рд╕реНрдЯреНрд░реАрдо рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдЯреНрд░реЛрдлрд╝рд┐рдЯ рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рддрд╛ рд╣реИ:

 public suspend fun <T : Any> Call<T>.await(): T { return suspendCancellableCoroutine { continuation -> enqueue(object : Callback<T> { override fun onResponse(call: Call<T>?, response: Response<T?>) { if (response.isSuccessful) { val body = response.body() if (body == null) { continuation.resumeWithException( NullPointerException("Response body is null: $response") ) } else { continuation.resume(body) } } else { continuation.resumeWithException(HttpException(response)) } } override fun onFailure(call: Call<T>, t: Throwable) { // Don't bother with resuming the continuation if it is already cancelled. if (continuation.isCancelled) return continuation.resumeWithException(t) } }) registerOnCompletion(continuation) } } 

рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ 3.2 рдореЗрдВ, рдЖрдк рдХреЛрд░рдЯрд┐рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ 0.25.0 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ CoroutineContext IO рд╣реИ (рдЖрдк рдореЗрд░реЗ UseCase рд╡рд░реНрдЧ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдХреЙрдордирдкреВрд▓ рдкрд░ рдмрд┐рдирд╛ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЙрд▓ рдХреЗ рдЪрд▓рдиреЗ рдореЗрдВ 2.3 рд╕реЗрдХрдВрдб рдФрд░ 2.4 рд╕реЗрдХрдВрдб рдореЗрдВ IO рдФрд░ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЙрд▓реНрд╕ рд▓рдЧреЗред

рдЫрд╡рд┐

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдЖрд░рдПрдХреНрд╕рдЬреИрд╡рд╛ рдХреЗ рд▓рд┐рдП рдХреЙрд░рдЯреАрди, рдПрдХ рд▓рд╛рдЗрдЯрд░ рдФрд░ рд╢рд╛рдпрдж рддреЗрдЬ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛, рдпрд╣ рд╕рдордЭрдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЖрдк рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi421739/


All Articles