Skip to content

Commit 62b9f0f

Browse files
committed
update
1 parent d56690e commit 62b9f0f

File tree

4 files changed

+36
-31
lines changed

4 files changed

+36
-31
lines changed

library/src/main/java/com/hoc081098/viewbindingdelegate/internal/cache.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,35 @@
2424

2525
package com.hoc081098.viewbindingdelegate.internal
2626

27+
import androidx.annotation.AnyThread
2728
import androidx.annotation.MainThread
2829
import androidx.collection.SimpleArrayMap
2930
import androidx.viewbinding.ViewBinding
3031
import java.lang.reflect.Method
3132
import kotlin.LazyThreadSafetyMode.NONE
3233

33-
@MainThread
3434
internal sealed interface MethodCache {
35+
@MainThread
3536
fun <T : ViewBinding> getOrPut(clazz: Class<T>): Method
3637

38+
operator fun <T : ViewBinding> get(clazz: Class<T>): Method?
39+
40+
@MainThread
3741
fun putAll(pairs: List<Pair<Class<out ViewBinding>, Method>>)
3842

43+
@AnyThread
3944
fun <T : ViewBinding> Class<T>.findMethod(): Method
4045
}
4146

42-
@MainThread
4347
private abstract class AbstractMethodCache : MethodCache {
4448
private val cache = SimpleArrayMap<Class<out ViewBinding>, Method>()
4549

4650
init {
4751
ensureMainThread()
4852
}
4953

54+
override fun <T : ViewBinding> get(clazz: Class<T>): Method? = cache[clazz]
55+
5056
override fun <T : ViewBinding> getOrPut(clazz: Class<T>) =
5157
cache[clazz] ?: clazz.findMethod().also { cache.put(clazz, it) }
5258

@@ -56,15 +62,14 @@ private abstract class AbstractMethodCache : MethodCache {
5662

5763
private class BindMethodCache : AbstractMethodCache() {
5864
override fun <T : ViewBinding> Class<T>.findMethod() =
59-
measureTimeMillis("[findBindMethod]") { findBindMethod() }
65+
measureTimeMillis("[BindMethodCache-findBindMethod]") { findBindMethod() }
6066
}
6167

6268
private class InflateMethodCache : AbstractMethodCache() {
6369
override fun <T : ViewBinding> Class<T>.findMethod() =
64-
measureTimeMillis("[findInflateMethod]") { findInflateMethod() }
70+
measureTimeMillis("[InflateMethodCache-findInflateMethod]") { findInflateMethod() }
6571
}
6672

67-
@MainThread
6873
internal object CacheContainer {
6974
private val bindMethodCache by lazy(NONE) {
7075
ensureMainThread()

library/src/main/java/com/hoc081098/viewbindingdelegate/internal/preload.kt

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,8 @@ package com.hoc081098.viewbindingdelegate.internal
2626

2727
import android.content.Context
2828
import androidx.annotation.MainThread
29-
import androidx.annotation.WorkerThread
3029
import androidx.core.content.ContextCompat
3130
import androidx.viewbinding.ViewBinding
32-
import java.lang.reflect.Method
3331
import java.util.concurrent.LinkedBlockingQueue
3432
import java.util.concurrent.ThreadFactory
3533
import java.util.concurrent.ThreadPoolExecutor
@@ -57,28 +55,36 @@ internal object PreloadMethods {
5755
}
5856

5957
@MainThread
60-
internal inline fun Context.preload(
58+
internal fun Context.preload(
6159
tag: String,
62-
classes: Array<out KClass<out ViewBinding>>,
63-
@WorkerThread crossinline func: Class<out ViewBinding>.() -> Method,
64-
@MainThread crossinline onSuccess: (List<Pair<Class<out ViewBinding>, Method>>) -> Unit
60+
kClasses: Array<out KClass<out ViewBinding>>,
61+
cache: MethodCache
6562
) {
66-
if (classes.isEmpty()) return
63+
if (kClasses.isEmpty()) {
64+
log { "$tag empty kClasses" }
65+
return
66+
}
67+
val classes = kClasses.mapNotNull { kClass ->
68+
kClass.java.takeIf { cache[it] === null }
69+
}
70+
if (classes.isEmpty()) {
71+
log { "$tag empty classes" }
72+
return
73+
}
6774

6875
val mainExecutor = ContextCompat.getMainExecutor(applicationContext)
6976

7077
ioExecutor.execute {
71-
log { "$tag start... classes=${classes.map { it.simpleName }}" }
78+
log { "$tag start... classes=${kClasses.map { it.simpleName }}" }
7279

7380
val methods = measureTimeMillis(tag) {
74-
classes.map {
75-
val clazz = it.java
76-
clazz to clazz.func()
81+
classes.map { clazz ->
82+
clazz to cache.run { clazz.findMethod() }
7783
}
7884
}
7985

8086
mainExecutor.execute {
81-
onSuccess(methods)
87+
cache.putAll(methods)
8288
log { "$tag done" }
8389
}
8490
}

library/src/main/java/com/hoc081098/viewbindingdelegate/internal/utils.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ package com.hoc081098.viewbindingdelegate.internal
2828

2929
import android.os.Looper
3030
import android.util.Log
31-
import kotlin.system.measureTimeMillis
31+
import kotlin.system.measureNanoTime
3232

3333
@PublishedApi
3434
internal fun ensureMainThread(): Unit = check(Looper.getMainLooper() == Looper.myLooper()) {
@@ -40,15 +40,15 @@ private const val DEBUG = true
4040

4141
internal inline fun log(crossinline message: () -> String) {
4242
if (DEBUG) {
43-
Log.d("ViewBinding", message())
43+
Log.d("ViewBindingDelegate", message())
4444
}
4545
}
4646

4747
internal inline fun <T> measureTimeMillis(tag: String, crossinline block: () -> T): T =
4848
if (DEBUG) {
4949
val t: T
50-
val time = measureTimeMillis { t = block() }
51-
log { "$tag taken time=$time ms ~ ${time / 1_000.0} s" }
50+
val time = measureNanoTime { t = block() }
51+
log { "$tag taken time=$time ns ~ ${time / 1_000_000.0} ms" }
5252
t
5353
} else {
5454
block()

library/src/main/java/com/hoc081098/viewbindingdelegate/preload.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,19 @@ import kotlin.reflect.KClass
3434
@MainThread
3535
public fun Context.preloadBindMethods(vararg classes: KClass<out ViewBinding>): Unit =
3636
PreloadMethods.run {
37-
val bindMethodCache = CacheContainer.provideBindMethodCache()
38-
3937
preload(
4038
tag = "[preloadBindMethods]",
41-
classes = classes,
42-
func = { bindMethodCache.run { findMethod() } },
43-
onSuccess = { bindMethodCache.putAll(it) }
39+
kClasses = classes,
40+
cache = CacheContainer.provideBindMethodCache()
4441
)
4542
}
4643

4744
@MainThread
4845
public fun Context.preloadInflateMethods(vararg classes: KClass<out ViewBinding>): Unit =
4946
PreloadMethods.run {
50-
val inflateMethodCache = CacheContainer.provideInflateMethodCache()
51-
5247
preload(
5348
tag = "[preloadInflateMethods]",
54-
classes = classes,
55-
func = { inflateMethodCache.run { findMethod() } },
56-
onSuccess = { inflateMethodCache.putAll(it) }
49+
kClasses = classes,
50+
cache = CacheContainer.provideInflateMethodCache()
5751
)
5852
}

0 commit comments

Comments
 (0)