From e69b6fca0338d7829504ff8a2d60222e6bc82d7d Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Wed, 26 Jul 2023 10:49:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=BB=E5=8A=A1=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=8C=89=E9=92=AE=E5=88=B7=E6=96=B0=E4=B8=8D=E5=8F=8A?= =?UTF-8?q?=E6=97=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/taskdownload/TaskDownloadManager.kt | 8 +++-- .../http/taskdownload/TaskDownloadScope.kt | 33 ++++++++++++------- .../omqs/ui/fragment/tasklist/TaskAdapter.kt | 4 +-- .../omqs/ui/fragment/tasklist/TaskFragment.kt | 2 +- .../ui/fragment/tasklist/TaskListAdapter.kt | 31 ++++++++++++++--- .../ui/fragment/tasklist/TaskViewModel.kt | 2 +- .../navinfo/omqs/ui/other/BaseViewHolder.kt | 18 +++++++++- .../main/res/layout/fragment_task_list.xml | 2 +- 8 files changed, 75 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadManager.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadManager.kt index bfd74d35..4a0a95e8 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadManager.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadManager.kt @@ -1,6 +1,7 @@ package com.navinfo.omqs.http.taskdownload import android.content.Context +import android.util.Log import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.Observer import com.navinfo.collect.library.map.NIMapController @@ -17,7 +18,7 @@ import java.util.concurrent.ConcurrentHashMap class TaskDownloadManager constructor( val importFactory: ImportOMDBHiltFactory, val netApi: RetrofitNetworkServiceAPI, - val mapController:NIMapController + val mapController: NIMapController ) { lateinit var context: Context @@ -41,6 +42,7 @@ class TaskDownloadManager constructor( ConcurrentHashMap() } + fun init(context: Context) { this.context = context } @@ -102,8 +104,9 @@ class TaskDownloadManager constructor( fun addTask(taskBean: TaskBean) { + Log.e("jingo", "下载线程 ${taskBean.id}") if (!scopeMap.containsKey(taskBean.id)) { - scopeMap[taskBean.id] = TaskDownloadScope( this, taskBean) + scopeMap[taskBean.id] = TaskDownloadScope(this, taskBean) } } @@ -111,6 +114,7 @@ class TaskDownloadManager constructor( fun observer( id: Int, lifecycleOwner: LifecycleOwner, observer: Observer ) { + Log.e("jingo", "监听线程 ${id}") if (scopeMap.containsKey(id)) { scopeMap[id]!!.observer(lifecycleOwner, observer) } diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt index 60ff56fc..b2ce36ab 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt @@ -1,14 +1,16 @@ package com.navinfo.omqs.http.taskdownload import android.util.Log +import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer -import com.navinfo.omqs.Constant import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.omqs.Constant import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus +import com.navinfo.omqs.ui.other.BaseViewHolder import com.navinfo.omqs.util.DateTimeUtil import io.realm.Realm import kotlinx.coroutines.* @@ -21,7 +23,7 @@ class TaskDownloadScope( private val downloadManager: TaskDownloadManager, val taskBean: TaskBean, ) : - CoroutineScope by CoroutineScope(Dispatchers.IO + CoroutineName("OfflineMapDownLoad")) { + CoroutineScope by CoroutineScope(Dispatchers.IO + CoroutineName("TaskMapDownLoad")) { /** *下载任务,用来取消的 @@ -31,8 +33,8 @@ class TaskDownloadScope( /** * 管理观察者,同时只有一个就行了 */ - private val observer = Observer {} -// private var lifecycleOwner: LifecycleOwner? = null +// private val observer = Observer {} + private var lifecycleOwner: LifecycleOwner? = null /** *通知UI更新 @@ -92,6 +94,7 @@ class TaskDownloadScope( * @param status [OfflineMapCityBean.Status] */ private suspend fun change(status: Int, message: String = "") { + if (taskBean.status != status || status == FileDownloadStatus.LOADING || status == FileDownloadStatus.IMPORTING) { taskBean.status = status taskBean.message = message @@ -111,8 +114,9 @@ class TaskDownloadScope( * 添加下载任务观察者 */ fun observer(owner: LifecycleOwner, ob: Observer) { + removeObserver() -// this.lifecycleOwner = owner + this.lifecycleOwner = owner downloadData.observe(owner, ob) } @@ -134,9 +138,7 @@ class TaskDownloadScope( Log.e("jingo", "数据安装 $it") if (it == "finish") { withContext(Dispatchers.Main) { - downloadManager.mapController.layerManagerHandler.omdbLayersUpdate() downloadManager.mapController.mMapView.updateMap(true) - Log.e("jingo", "数据安装结束,刷新地图") } change(FileDownloadStatus.DONE) @@ -235,10 +237,17 @@ class TaskDownloadScope( } fun removeObserver() { - downloadData.observeForever(observer) -// lifecycleOwner?.let { - downloadData.removeObserver(observer) -// null -// } +// downloadData.observeForever(observer) +//// lifecycleOwner?.let { +// downloadData.removeObserver(observer) +//// null +//// } + if (lifecycleOwner != null) { + Log.e( + "jingo", + "移除的上一个监听者 ${lifecycleOwner.hashCode()} ${(lifecycleOwner as BaseViewHolder).tag}" + ) + downloadData.removeObservers(lifecycleOwner!!) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt index ee7ec323..8c164c07 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt @@ -11,7 +11,7 @@ import com.navinfo.omqs.ui.other.BaseViewHolder interface TaskAdapterCallback { fun itemOnClick(bean: HadLinkDvoBean) - fun editOnclick(position: Int, bean: HadLinkDvoBean) + fun editOnClick(position: Int, bean: HadLinkDvoBean) } /** @@ -54,7 +54,7 @@ class TaskAdapter( } binding.taskEdit.isSelected = bean.reason != "" binding.taskEdit.setOnClickListener { - callback.editOnclick(position, bean) + callback.editOnClick(position, bean) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt index 9312378b..e053d264 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt @@ -45,7 +45,7 @@ class TaskFragment : BaseFragment() { } } - override fun editOnclick(position: Int, bean: HadLinkDvoBean) { + override fun editOnClick(position: Int, bean: HadLinkDvoBean) { showLinkEditDialog(position, bean) } }) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index f7f7e3a8..9d450b60 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -7,6 +7,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import com.navinfo.collect.library.data.entity.TaskBean @@ -19,6 +23,7 @@ import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus import com.navinfo.omqs.tools.FileManager.Companion.FileUploadStatus import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder +import com.navinfo.omqs.ui.other.OnLifecycleStateListener import com.navinfo.omqs.ui.widget.LeftDeleteView /** @@ -115,6 +120,7 @@ class TaskListAdapter( override fun onViewRecycled(holder: BaseViewHolder) { super.onViewRecycled(holder) //页面滑动时会用holder重构页面,但是对进度条的监听回调会一直返回,扰乱UI,所以当当前holder去重构的时候,移除监听 + //这里 BaseViewHolder 的LifecycleOwner 状态很早就DESTROYED 了,这个回调比较晚,起到的作用很小 downloadManager.removeObserver(holder.tag.toInt()) } @@ -122,7 +128,7 @@ class TaskListAdapter( holder: BaseViewHolder, @SuppressLint("RecyclerView") position: Int ) { - Log.e("jingo", "TaskListAdapter onBindViewHolder $position ") + val binding: AdapterTaskListBinding = holder.viewBinding as AdapterTaskListBinding val taskBean = data[position] @@ -141,8 +147,22 @@ class TaskListAdapter( //tag 方便onclick里拿到数据 holder.tag = taskBean.id.toString() changeViews(binding, taskBean) + holder.addObserver(object : OnLifecycleStateListener { + override fun onState(tag: String, state: Lifecycle.State) { + when (state) { + Lifecycle.State.STARTED -> + downloadManager.observer( + taskBean.id, + holder, + DownloadObserver(taskBean.id, holder) + ) + Lifecycle.State.DESTROYED -> + downloadManager.removeObserver(tag.toInt()) + else -> {} + } + } + }) downloadManager.addTask(taskBean) - downloadManager.observer(taskBean.id, holder, DownloadObserver(taskBean.id, holder)) uploadManager.addTask(taskBean) uploadManager.observer(taskBean.id, holder, UploadObserver(taskBean.id, binding)) if (taskBean.status == FileDownloadStatus.NONE) { @@ -195,9 +215,10 @@ class TaskListAdapter( binding.taskDeleteLayout.setOnClickListener { //重置状态 leftDeleteView?.resetDeleteStatus() - if(taskBean.syncStatus != FileUploadStatus.DONE){ - Toast.makeText(binding.taskUploadBtn.context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT).show() - }else{ + if (taskBean.syncStatus != FileUploadStatus.DONE) { + Toast.makeText(binding.taskUploadBtn.context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT) + .show() + } else { itemListener?.invoke(position, ItemClickStatus.DELETE_LAYOUT_CLICK, taskBean) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index b6f25996..e646eba1 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -160,7 +160,7 @@ class TaskViewModel @Inject constructor( val objects = realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or() .between("operationTime", beginNowTime, nowTime) - .equalTo("syncStatus", syncUpload).findAll() + .equalTo("syncStatus", syncUpload).findAll().sort("id") val taskList = realm.copyFromRealm(objects) for (item in taskList) { FileManager.checkOMDBFileInfo(item) diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt b/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt index 2544a7c0..7127a482 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt @@ -16,6 +16,8 @@ open class BaseViewHolder(val viewBinding: ViewBinding) : private val lifecycleRegistry = LifecycleRegistry(this) var tag = "" + private var listener: OnLifecycleStateListener? = null + init { // dataBinding.lifecycleOwner = this lifecycleRegistry.currentState = Lifecycle.State.INITIALIZED @@ -37,19 +39,33 @@ open class BaseViewHolder(val viewBinding: ViewBinding) : fun onStart() { lifecycleRegistry.currentState = Lifecycle.State.STARTED // lifecycleRegistry.currentState = Lifecycle.State.RESUMED // ON_RESUME EVENT + listener?.onState(tag,Lifecycle.State.STARTED) } fun onStop() { lifecycleRegistry.currentState = Lifecycle.State.STARTED // - lifecycleRegistry.currentState = Lifecycle.State.CREATED // ON_STOP EVENT + lifecycleRegistry.currentState = Lifecycle.State.CREATED // +// listener?.onState(tag,Lifecycle.State.STARTED)// ON_STOP EVENT } fun onDestroy() { lifecycleRegistry.currentState = Lifecycle.State.DESTROYED /// ON_DESTROY EVENT + listener?.onState(tag,Lifecycle.State.DESTROYED) } override fun getLifecycle(): Lifecycle { return lifecycleRegistry } + + fun addObserver(listener: OnLifecycleStateListener) { + this.listener = listener + } +} + +/** + * 生命周期变化 + */ +interface OnLifecycleStateListener { + fun onState(tag:String,state: Lifecycle.State) } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task_list.xml b/app/src/main/res/layout/fragment_task_list.xml index 3fe6330f..6f62c900 100644 --- a/app/src/main/res/layout/fragment_task_list.xml +++ b/app/src/main/res/layout/fragment_task_list.xml @@ -41,7 +41,7 @@ app:layout_constraintRight_toRightOf="@id/task_list_search" app:layout_constraintTop_toTopOf="@id/task_list_search" /> -