
рдпрд╛рд░реНрдб рдореЗрдВ 2018 рд╡рд░реНрд╖ред рддреЗрдЬреА рд╕реЗ, RxJava рдФрд░ LiveData рд╢рдмреНрдж рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдРрд╕рд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрднреА рднреА рдкреБрд░рд╛рдиреЗ рдЬрдорд╛рдиреЗ рдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб-рдкреНрд░рд╛рдпреЛрд░рд┐рдЯреА-рдЬреЙрдмрдХреНрдпреВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдпрд╛ AsyncTask (рд╣рд╛рдБ, рдпрд╣ рд╣реЛрддрд╛ рд╣реИ) рджреНрд╡рд╛рд░рд╛ рд╢рд╛рд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд▓реЗрдЦ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИред рдореИрдВ рдЙрдирдХреЗ рджрд░реНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВред рдкрд╣рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдХрд╛рдо рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рджреВрд╕рд░рд╛ - рдПрдХ рдХрд╛рд░реНрдп рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд┐рд╕рдореЗрдВ рджреГрд╢реНрдп рдЗрд╕реЗ рд╕реБрдирддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЬреАрд╡рди рдЪрдХреНрд░ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕реНрдХреНрд░реАрди рдШреБрдорд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдХрдЯ рдХреЗ рддрд╣рдд, рдореИрдВ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд▓рд┐рдП RxJava рдФрд░ LiveData рдХреЗ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рдкреНрд░рд╡рд╛рд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред
рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдп рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдХреБрдЫ рд▓рдВрдмрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди рдореЗрдВ, рдореИрдВрдиреЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рдХрддрд╛рдИ рдкреНрд░реЛрдЧреНрд░реЗрд╕рдмрд╛рд░ рд░рдЦрд╛, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╛рдо рдХрдм рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
class Work { fun doWork() = try { for (i in 0 until 10) { Thread.sleep(500) } "work is done" } catch (e: InterruptedException) { "work is cancelled" } }
AsyncTask
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ AsyncTask рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ onPause () рдпрд╛ onStop () рдореЗрдВ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн рд▓реАрдХ рди рд╣реЛред рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдорд╛рдирдХ AsyncTask рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рдкреВрд░реНрд╡рд╡рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖрдП:
class AsyncTaskCancellable<Params, Result>( private val job: Job<Params, Result>, private var callback: AsyncTaskCallback<Result>?) : AsyncTask<Params, Void, AsyncTaskCancellable.ResultContainer<Result>>(), WorkManager.Cancellable { interface Job<Params, Result> { fun execute(params: Array<out Params>): Result } override fun doInBackground(vararg params: Params): AsyncTaskCancellable.ResultContainer<Result> { return try { ResultContainer(job.execute(params)) } catch (throwable: Throwable) { ResultContainer(throwable) } } override fun onPostExecute(result: AsyncTaskCancellable.ResultContainer<Result>) { super.onPostExecute(result) if (result.error != null) { callback?.onError(result.error!!) } else { callback?.onDone(result.result!!) } } override fun cancel() { cancel(true) callback = null } class ResultContainer<T> { var error: Throwable? = null var result: T? = null constructor(result: T) { this.result = result } constructor(error: Throwable) { this.error = error } } }
рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдХрд╛рд░реНрдп рдХрд╛ рд╢реБрднрд╛рд░рдВрдн рдЬреЛрдбрд╝реЗрдВ:
class WorkManager { fun doWorkInAsyncTask(asyncTaskCallback: AsyncTaskCallback<String>): Cancellable { return AsyncTaskCancellable(object : AsyncTaskCancellable.Job<Void, String> { override fun execute(params: Array<out Void>) = Work().doWork() }, asyncTaskCallback).apply { execute() } } }
рд╣рдо рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдПрдХ рдХреЛ рд░рджреНрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдЧрд░ рдПрдХ рд╣реИ:
class MainActivity : AppCompatActivity() { ... loadWithAsyncTask.setOnClickListener { asyncTaskCancellable?.cancel() asyncTaskCancellable = workManager.doWorkInAsyncTask(object : AsyncTaskCallback<String> { override fun onDone(result: String) { onSuccess(result) } override fun onError(throwable: Throwable) { this@MainActivity.onError(throwable) } }) } ... }
рдЗрд╕реЗ рдСрди-рдкреНрд░реЗрдЬ рдореЗрдВ рд░рджреНрдж рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ ():
override fun onPause() { asyncTaskCancellable?.cancel() super.onPause() }
рдпрд╣рд╛рдБ AsyncTask рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЙрд▓рдмреИрдХ MainActivity рдХрд╛ рд▓рд┐рдВрдХ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рддрдм рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдорд╣рддреНрд╡рд╣реАрди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рд╕реНрдХреНрд░реАрди рдХреЛ рдлреНрд▓рд┐рдк рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рдЧрддрд┐рд╡рд┐рдзрд┐ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреА)ред
RxJava рдкрд░, рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдзрд┐рдХ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд╣рдо рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ
Schedulers.computation () рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
class WorkManager { ... fun doWorkInRxJava(): Observable<String> { return Observable.fromCallable { Work().doWork() }.subscribeOn(Schedulers.computation()) } ... }
рд╣рдо рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ:
class MainActivity : AppCompatActivity() { ... loadWithRx.setOnClickListener { _ -> rxJavaSubscription?.dispose() rxJavaSubscription = workManager.doWorkInRxJava() .observeOn(AndroidSchedulers.mainThread()) .subscribe({ onSuccess(it) }, { onError(it) }) } ... }
рдСрдирдкреЛрдЬрд╝ () рдореЗрдВ рдЕрдкрдиреЗ рд▓рд┐рдП рд╕рдлрд╛рдИ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ:
override fun onPause() { rxJavaSubscription?.dispose() super.onPause() }
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, RxJava рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди RxBinding рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдереЛрдбрд╝рд╛ рдкреВрд░рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ Android рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдПрдХ рдЕрд╡рд▓реЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
RxView.clicks () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдмрдЯрди рдХреЗ рд╕рд╛рде рд╕реБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
class MainActivity : AppCompatActivity() { ... rxJavaSubscription = RxView.clicks(loadWithRx) .concatMap { workManager.doWorkInRxJava() .observeOn(AndroidSchedulers.mainThread()) .doOnNext { result -> onSuccess(result) } .onErrorReturn { error -> onError(error) "" } } .subscribe() ... }
рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдСрдирд░реНрд░реЛрдЯ рд░реАрдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдорд╛рдкреНрдд рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдХрд╛рд░реНрдп рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рдЕрдВрддрд┐рдо рд╕рджрд╕реНрдпрддрд╛ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧрд╛, рдФрд░ рдХреНрд▓рд┐рдХ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд░рд╣реЗрдВрдЧреЗред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдЯреЗрдЯрд┐рдХ рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ, рдЬреЛ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ (), рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рддрдХ рдбрд┐рд╕реНрдкреЛрдЬрд▓ () рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдпрд╣ рдЖрдкрдХреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд▓рд┐рдВрдХ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореЗрдореЛрд░реА рд▓реАрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЖрдкрдХреЛ рдЧрд▓рддреА рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЧрд▓рддреА рд╕реЗ рдореВрд▓ рдзрд╛рд░рд╛ рд╕рдорд╛рдкреНрдд рди рд╣реЛред
рдПрдВрдбреНрд░реЙрдпрдб рдкреНрд░рд╛рдердорд┐рдХрддрд╛-jobqueue
рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдмрдВрдзрдХ рд╣реИ рдЬреЛ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдЙрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИред LiveData, рдЬреЛ рдЬреАрд╡рди рдЪрдХреНрд░ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рдРрд╕реЗ рдкреНрд░рдмрдВрдзрдХ рдФрд░ UI рдХреЗ рдмреАрдЪ рдПрдХ рдкрд░рдд рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдореЗрдВ рд╕рд╣рд╛рдпрдХ рд╕рдВрд╕рд╛рдзрди рдЖрд╡рд░рдг рд╡рд░реНрдЧ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐, рддреНрд░реБрдЯрд┐ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред
class Resource<T> private constructor(val status: Status, val data: T?, val error: Throwable?) { constructor(data: T) : this(Status.SUCCESS, data, null) constructor(error: Throwable) : this(Status.ERROR, null, error) constructor() : this(Status.LOADING, null, null) enum class Status { SUCCESS, ERROR, LOADING } }
рдЕрдм рд╣рдо рдПрдХ WorkViewModel рд╡рд░реНрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ LiveData рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WorkViewModel рдмрдирд╛рдпрд╛ред рдореИрдВ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдореЗрдВ RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ LiveData рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реВрдВрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд▓реАрдХ рдирд╣реАрдВ рд╣реЛрдЧреАред
class WorkViewModel private constructor() { companion object { val instance = WorkViewModel() } private val liveData: MutableLiveData<Resource<String>> = MutableLiveData() private var workSubscription: Disposable? = null fun startWork(work: Work) { liveData.value = Resource() workSubscription?.dispose() workSubscription = Observable.fromCallable { work.doWork() } .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ liveData.value = Resource(it) }, { liveData.value = Resource(it) }) } fun getWork(): LiveData<Resource<String>> = liveData }
рд╣рдо рдПрдХрд░реВрдкрддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдХрд░рдХреЗ рд╡рд░реНрдХрдореИрди рдХреЛ рдкреВрд░рдХ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рддрд╛рдХрд┐ рдХрд╛рдо рд╣рдореЗрд╢рд╛ рдЗрд╕ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реБрд░реВ рд╣реЛ:
class WorkManager { ... fun doOnLiveData() { WorkViewModel.instance.startWork(Work()) } ... }
рдФрд░ рд╣рдо рдЗрд╕ рд╕рдм рдХреЗ рд╕рд╛рде MainActivity рдореЗрдВ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред WorkViewModel рд╕реЗ рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдЬреАрд╡рдВрдд рд╣реИ, рдФрд░ рд╣рдо рдПрдХ рдирдпрд╛ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
class MainActivity : AppCompatActivity() { ... WorkViewModel.instance.getWork().observe(this, Observer { when { it?.status == Resource.Status.SUCCESS -> onSuccess(it.data!!) it?.status == Resource.Status.ERROR -> onError(it.error!!) it?.status == Resource.Status.LOADING -> loadWithLiveData.isEnabled = false } }) loadWithLiveData.setOnClickListener { workManager.doOnLiveData() } ... }
рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣, рдпрд╣ RxJava рдХреЗ рдПрдХ рд╡рд┐рд╖рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, LiveData рдЬреАрд╡рди рдЪрдХреНрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдмрдХрд┐ рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рдЖрдк рд╕реНрдЯреНрд░реАрдо рдФрд░ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ RxJava рдФрд░ LiveData рдХрд╛ рд╕рд╣рдЬреАрд╡рди рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИ: рдкрд╣рд▓рд╛ рдбреЗрдЯрд╛ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреАрд╡рди рдЪрдХреНрд░ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдкреГрд╖реНрдарднреВрдорд┐ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреБрд░рд╛рддрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рд╕рдВрдХреНрд░рдордг рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХреАред рдПрдХ рдмрд╛рд░ рдХреЗ рдорд╛рдореВрд▓реА рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдирдЧреНрди RxJava рдПрдХрджрдо рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдЙрди рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рди рдкрд░ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕реА рд╕рдордп, рдпрджрд┐ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рдорд╣реАрди рдмрд╛рддрдЪреАрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ LiveData рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕реНрд░реЛрдд рдХрд╛ рдкреВрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЧрд┐рдЯрд╣рдмрдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА!