Skip to content

Instantly share code, notes, and snippets.

View longv's full-sized avatar
:shipit:
On a mission to be blazingly fast

Long Vu longv

:shipit:
On a mission to be blazingly fast
View GitHub Profile
@longv
longv / LifecycleAwareLazy.kt
Created February 11, 2021 12:34
Lifecycle-aware Lazy
fun <T> LifecycleOwner.lifecycleAwareLazy(initializer: () -> T): Lazy<T> = LifecycleAwareLazy(this, initializer)
private object UninitializedValue
class LifecycleAwareLazy<out T>(
private val owner: LifecycleOwner,
initializer: () -> T
) : Lazy<T>, Serializable, LifecycleObserver {
private var initializer: (() -> T)? = initializer
class MainActivity {
// ...
private val viewModel by viewModels { viewModelFactory }
private lateinit var adapter: DataBindingAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fun debugSubscribeOn(): Disposable =
Observable.just(1)
.doOnNext {
println(Thread.currentThread().name) // RxCachedThreadScheduler-1
}
.subscribeOn(Schedulers.io())
.flatMap {
println(Thread.currentThread().name) // RxCachedThreadScheduler-1
Observable.just(it)
.doOnNext {
fun debugSubscribeOn(): Disposable =
Observable.just(1)
.doOnNext {
println(Thread.currentThread().name) // RxCachedThreadScheduler-1
}
.subscribeOn(Schedulers.io())
.flatMap {
println(Thread.currentThread().name) // RxCachedThreadScheduler-1
Observable.just(it)
.subscribeOn(Schedulers.computation())
fun debugSubscribeOn(): Disposable =
Observable.just(1, 2, 3)
.doOnNext {
println(Thread.currentThread().name) // RxCachedThreadScheduler-1
}
.subscribeOn(Schedulers.io())
.subscribeOn(Schedulers.computation())
.doOnNext {
println(Thread.currentThread().name) // RxCachedThreadScheduler-1
}
fun debugSubscribeOn(): Disposable =
Observable.just(1, 2, 3)
.doOnNext {
println(Thread.currentThread().name) // RxCachedThreadScheduler-1
}
.subscribeOn(Schedulers.io())
.doOnNext {
println(Thread.currentThread().name) // RxCachedThreadScheduler-1
}
.subscribe()
@longv
longv / main_item_list.xml
Created November 3, 2019 09:42
Usage of model attribute in data binding RecyclerView
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="listModel"
type="androidx.lifecycle.LiveData&lt;me.longv.pokedex.databinding.RecyclerViewModel>"/>
</data>
@longv
longv / BindingAdapters.kt
Created November 3, 2019 09:32
Binding attributes for data binding RecyclerView
package me.longv.pokedex.databinding
import androidx.databinding.BindingAdapter
import androidx.recyclerview.widget.RecyclerView
@BindingAdapter(value = ["model"])
fun setupRecyclerView(view: RecyclerView, model: RecyclerViewModel?) {
model?.apply {
view.adapter = DataBindingAdapter(bindingEntries)
view.layoutManager = layoutManager
@longv
longv / DataBindingAdapter.kt
Last active February 1, 2021 22:52
DataBindingAdapter for data binding RecyclerView
class DataBindingAdapter(private var bindingEntries: List<DataBindingEntry> = emptyList())
: RecyclerView.Adapter<DataBindingViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBindingViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val viewBinding = DataBindingUtil.inflate<ViewDataBinding>(layoutInflater, viewType, parent, false)
return DataBindingViewHolder(viewBinding)
}
override fun onBindViewHolder(holder: DataBindingViewHolder, position: Int) {
@longv
longv / DataBindingViewHolder.kt
Last active February 1, 2021 22:28
DataBindingViewHolder for data binding RecyclerView
class DataBindingViewHolder(private val viewBinding: ViewDataBinding): RecyclerView.ViewHolder(viewBinding.root) {
fun bind(bindingEntry: DataBindingEntry) {
viewBinding.apply {
bindingEntry.bindings.forEach { setVariable(it.key, it.value) }
}
}
}