From 9ad1bff9af18027b3ae4eeaa68aa3cf76e7260f3 Mon Sep 17 00:00:00 2001 From: maxinghai Date: Thu, 28 Jul 2022 20:37:07 +0800 Subject: [PATCH] feat: add itemAsync function --- .../java/com/worktile/lib/MainActivity.kt | 12 +++---- build.gradle | 7 +++-- common/build.gradle | 1 + common/src/main/AndroidManifest.xml | 21 ++++++++++++- .../main/java/com/worktile/common/Worktile.kt | 6 +++- .../worktile/common/WorktileInitializer.kt | 17 ++++++++++ recyclerview/build.gradle | 6 ++-- recyclerview2/build.gradle | 6 ++-- .../java/com/worktile/ui/recyclerview/Item.kt | 31 ++++++++++++++++--- .../worktile/ui/recyclerview/SimpleAdapter.kt | 3 ++ recyclerview2/src/main/res/values/ids.xml | 1 + widgets/build.gradle | 3 +- 12 files changed, 87 insertions(+), 27 deletions(-) create mode 100644 common/src/main/java/com/worktile/common/WorktileInitializer.kt diff --git a/app/src/main/java/com/worktile/lib/MainActivity.kt b/app/src/main/java/com/worktile/lib/MainActivity.kt index 194daf0..13fa02e 100644 --- a/app/src/main/java/com/worktile/lib/MainActivity.kt +++ b/app/src/main/java/com/worktile/lib/MainActivity.kt @@ -6,23 +6,16 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.GridLayoutManager import com.worktile.common.default -import com.worktile.json.JsonDsl -import com.worktile.json.Parser -import com.worktile.json.ParserData import com.worktile.ui.recyclerview.* import com.worktile.ui.recyclerview.data.EdgeState import com.worktile.ui.recyclerview.data.LoadingState import kotlinx.android.synthetic.main.activity_main.* import kotlinx.coroutines.* import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.collect -import org.json.JSONObject import java.util.* class MainActivity : AppCompatActivity() { @@ -152,6 +145,11 @@ interface TestItemViewModel : ItemDefinition { override fun bind(itemView: View) { (itemView as? TextView)?.text = title.value + itemAsync { + main(itemView) { + + } + } } override fun type(): Any = TestItemViewModel::class diff --git a/build.gradle b/build.gradle index 0cf06b3..6bdb9f4 100644 --- a/build.gradle +++ b/build.gradle @@ -98,10 +98,10 @@ def configPublish(Project project, group, _artifact, ver) { } ext { - common_version = "0.0.9.220050821-SNAPSHOT" - widgets_version = "0.0.1.22040815-SNAPSHOT" + common_version = "0.0.9.22070923-SNAPSHOT" + widgets_version = "0.0.1.22071000-SNAPSHOT" recyclerview_version = "0.9.7.21101500-SNAPSHOT" - recyclerview2_version = "1.0.0.2207050101-SNAPSHOT" + recyclerview2_version = "1.0.0.22072502-SNAPSHOT" json_version = "0.2.1.22031623-SNAPSHOT" kanban_version = "0.0.1.22012702-SNAPSHOT" wt_common = "com.worktile:common:$common_version" as GStringImpl @@ -121,4 +121,5 @@ ext { recyclerview = 'androidx.recyclerview:recyclerview:1.2.1' constraintlayout = "androidx.constraintlayout:constraintlayout:2.0.1" viewpager2 = "androidx.viewpager2:viewpager2:1.0.0" + startup_runtime = "androidx.startup:startup-runtime:1.0.0" } diff --git a/common/build.gradle b/common/build.gradle index 33ac76a..1123146 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -46,6 +46,7 @@ dependencies { implementation core_ktx implementation acticity_ktx implementation lifecycle_runtime_ktx + implementation startup_runtime testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' diff --git a/common/src/main/AndroidManifest.xml b/common/src/main/AndroidManifest.xml index 29c5e46..6cbe74d 100644 --- a/common/src/main/AndroidManifest.xml +++ b/common/src/main/AndroidManifest.xml @@ -1,2 +1,21 @@ + xmlns:tools="http://schemas.android.com/tools" + package="com.worktile.common"> + + + + + + + + + + + + diff --git a/common/src/main/java/com/worktile/common/Worktile.kt b/common/src/main/java/com/worktile/common/Worktile.kt index bef4cc6..99bb15c 100644 --- a/common/src/main/java/com/worktile/common/Worktile.kt +++ b/common/src/main/java/com/worktile/common/Worktile.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.app.Activity import android.app.Application import android.os.Bundle +import android.util.Log @SuppressLint("StaticFieldLeak") object Worktile { @@ -14,7 +15,10 @@ object Worktile { private var application: Application? = null fun install(application: Application) { - if (this.application != null) return + if (this.application != null) { + Log.e("Worktile", "不要重复初始化Worktile") + return + } this.application = application val contextRecorder = object : ActivityLifecycleCallbacks() { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { diff --git a/common/src/main/java/com/worktile/common/WorktileInitializer.kt b/common/src/main/java/com/worktile/common/WorktileInitializer.kt new file mode 100644 index 0000000..4b04a79 --- /dev/null +++ b/common/src/main/java/com/worktile/common/WorktileInitializer.kt @@ -0,0 +1,17 @@ +package com.worktile.common + +import android.app.Application +import android.content.Context +import androidx.startup.Initializer + +class WorktileInitializer : Initializer { + override fun create(context: Context): WorktileInitializer { + Worktile.install(context as Application) + return this + } + + override fun dependencies(): MutableList>> { + return mutableListOf() + } + +} \ No newline at end of file diff --git a/recyclerview/build.gradle b/recyclerview/build.gradle index 9895c0b..6108874 100644 --- a/recyclerview/build.gradle +++ b/recyclerview/build.gradle @@ -46,10 +46,8 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' - debugApi project(path: ':common') - debugImplementation project(path: ':widgets') - releaseApi wt_common - releaseImplementation wt_widgets + api project(path: ':common') + implementation project(path: ':widgets') } configPublish.call(project, 'com.worktile.ui', 'recyclerview', recyclerview_version) \ No newline at end of file diff --git a/recyclerview2/build.gradle b/recyclerview2/build.gradle index 8ce5ba6..76f796e 100644 --- a/recyclerview2/build.gradle +++ b/recyclerview2/build.gradle @@ -44,10 +44,8 @@ dependencies { implementation lifecycle_runtime_ktx api recyclerview - debugApi project(path: ':common') - debugImplementation project(path: ':widgets') - releaseApi wt_common - releaseImplementation wt_widgets + api project(path: ':common') + implementation project(path: ':widgets') testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' diff --git a/recyclerview2/src/main/java/com/worktile/ui/recyclerview/Item.kt b/recyclerview2/src/main/java/com/worktile/ui/recyclerview/Item.kt index 84be77b..52c6024 100644 --- a/recyclerview2/src/main/java/com/worktile/ui/recyclerview/Item.kt +++ b/recyclerview2/src/main/java/com/worktile/ui/recyclerview/Item.kt @@ -2,12 +2,12 @@ package com.worktile.ui.recyclerview import android.view.View import android.view.ViewGroup -import androidx.core.view.forEachIndexed -import androidx.lifecycle.LiveData -import androidx.recyclerview.widget.RecyclerView -import com.worktile.common.Default -import java.lang.reflect.Field +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.util.* +import java.util.concurrent.ConcurrentHashMap typealias ViewCreator = (parent: ViewGroup) -> View @@ -39,3 +39,24 @@ inline fun contentArrayOf(vararg elements: T): Array> return arrayOf(*elements).map { ContentItem(it) }.toTypedArray() } +internal val postponeAsyncMainBlocks = WeakHashMap Unit>() + +fun ItemDefinition.itemAsync(async: suspend ItemAsyncScope.() -> Unit) { + CoroutineScope(Dispatchers.Default).launch { + async.invoke(ItemAsyncScope()) + } +} + +class ItemAsyncScope { + suspend fun ItemDefinition.main(itemView: View, block: () -> Unit) { + withContext(Dispatchers.Main) { + val keyInTag = itemView.getTag(R.id.item_definition_key) + if (keyInTag == key() || keyInTag == null) { + block() + } else { + postponeAsyncMainBlocks[this@main] = block + } + } + } +} + diff --git a/recyclerview2/src/main/java/com/worktile/ui/recyclerview/SimpleAdapter.kt b/recyclerview2/src/main/java/com/worktile/ui/recyclerview/SimpleAdapter.kt index 470e8c5..e0f50b9 100644 --- a/recyclerview2/src/main/java/com/worktile/ui/recyclerview/SimpleAdapter.kt +++ b/recyclerview2/src/main/java/com/worktile/ui/recyclerview/SimpleAdapter.kt @@ -44,6 +44,9 @@ class SimpleAdapter( data[position].apply { contentSparseArray.put(position, content()) holder.itemData = this + holder.itemView.setTag(R.id.item_definition_key, key()) + postponeAsyncMainBlocks[this]?.invoke() + postponeAsyncMainBlocks.remove(this) bind(holder.itemView) } } diff --git a/recyclerview2/src/main/res/values/ids.xml b/recyclerview2/src/main/res/values/ids.xml index 63a6527..978c1ad 100644 --- a/recyclerview2/src/main/res/values/ids.xml +++ b/recyclerview2/src/main/res/values/ids.xml @@ -6,4 +6,5 @@ + \ No newline at end of file diff --git a/widgets/build.gradle b/widgets/build.gradle index 368de5f..3b68e8f 100644 --- a/widgets/build.gradle +++ b/widgets/build.gradle @@ -40,8 +40,7 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' - debugApi project(path: ':common') - releaseApi wt_common + api project(path: ':common') } configPublish.call(project, 'com.worktile.ui', 'widgets', widgets_version) \ No newline at end of file