forked from jitinsharma/Kotlin.someExtensions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ThreadingBlocks.kt
52 lines (48 loc) · 1.62 KB
/
ThreadingBlocks.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package io.github.jitinsharma.kotlinsomeextensions
import android.os.Handler
import android.os.Looper
import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.experimental.Deferred
import kotlinx.coroutines.experimental.android.UI
import kotlinx.coroutines.experimental.async
import org.jetbrains.anko.coroutines.experimental.bg
/**
* Executes block of code on Android's main thread. Can be called from background thread.
*/
inline fun uiThreadExecutor(crossinline block: () -> Unit) {
val mainHandler = Handler(Looper.getMainLooper())
mainHandler.post{
block()
}
}
/**
* Executes a function using RxJava observable on a separate thread and
* exposes it's response as lambda on main thread
* REQUIRED: RxJava, RxKotlin, RxAndroid
*/
fun <T> asyncRxExecutor(heavyFunction: () -> T, response : (response : T?) -> Unit) {
val observable = Single.create<T>({e ->
e.onSuccess(heavyFunction())
})
observable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { t: T? ->
response(t)
}
}
/**
* Executes a function using Kotlin coroutines on a separate thread pool and
* exposes it's response as lambda on main thread.
* Thread pool is maintained by Anko Coroutines lib
* REQUIRED: Anko Coroutines
*/
fun <T> asyncCoroutinesExecutor(heavyFunction: () -> T, response : (response : T?) -> Unit) {
async(UI) {
val data : Deferred<T> = bg {
heavyFunction()
}
response(data.await())
}
}