diff --git a/app/src/main/java/com/xjjk/healthyclients/MainActivity.kt b/app/src/main/java/com/xjjk/healthyclients/MainActivity.kt index efc5de2..21b051d 100644 --- a/app/src/main/java/com/xjjk/healthyclients/MainActivity.kt +++ b/app/src/main/java/com/xjjk/healthyclients/MainActivity.kt @@ -272,9 +272,6 @@ class MainActivity : BaseVMBActivity(R.layou super.onPause() } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(Bundle()) - } override fun getFragmentByTag(tabTag: String): Fragment? { when (tabTag) { diff --git a/app/src/main/java/com/xjjk/healthyclients/base/BaseVMBActivity.kt b/app/src/main/java/com/xjjk/healthyclients/base/BaseVMBActivity.kt index bf9ceec..66056cc 100644 --- a/app/src/main/java/com/xjjk/healthyclients/base/BaseVMBActivity.kt +++ b/app/src/main/java/com/xjjk/healthyclients/base/BaseVMBActivity.kt @@ -70,15 +70,6 @@ abstract class BaseVMBActivity(private var mEmpty: View?=null var mRootView:RelativeLayout?=null - /** - * 重写getResources()方法,让APP的字体不受系统设置字体大小影响 - */ - override fun getResources(): Resources? { - val config = Configuration() - config.setToDefaults() - createConfigurationContext(config) - return super.getResources() - } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/xjjk/healthyclients/base/BaseVMBFragment.kt b/app/src/main/java/com/xjjk/healthyclients/base/BaseVMBFragment.kt index 0526cb3..815a2db 100644 --- a/app/src/main/java/com/xjjk/healthyclients/base/BaseVMBFragment.kt +++ b/app/src/main/java/com/xjjk/healthyclients/base/BaseVMBFragment.kt @@ -56,15 +56,21 @@ abstract class BaseVMBFragment(private private var mIsFirstLoading = true var dialog: LoadingDialog? = null protected lateinit var mViewModel: VM - lateinit var mBinding: B + + /** ViewDataBinding 可空 backing field,onDestroyView 时置 null 防止内存泄漏 */ + private var _mBinding: B? = null + + /** 对外暴露的非空 getter,仅在 onCreateView ~ onDestroyView 生命周期内有效 */ + val mBinding: B get() = _mBinding!! + var mEmpty: View? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - mBinding = DataBindingUtil.inflate(inflater, contentViewResId, container, false) - return mBinding.root + _mBinding = DataBindingUtil.inflate(inflater, contentViewResId, container, false) + return _mBinding!!.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -306,13 +312,15 @@ abstract class BaseVMBFragment(private } override fun onDestroyView() { - mBinding == null super.onDestroyView() + // 置 null 释放 View 引用,防止 Fragment 回退栈期间内存泄漏 + _mBinding = null } override fun onDestroy() { super.onDestroy() - if (!EventBus.getDefault().isRegistered(this)) { + // 已注册才执行注销,避免 EventBus 持有 Fragment 引用 + if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this) } } diff --git a/app/src/main/java/com/xjjk/healthyclients/fragment/EmergencyFragment.kt b/app/src/main/java/com/xjjk/healthyclients/fragment/EmergencyFragment.kt index e9f841e..791b50b 100644 --- a/app/src/main/java/com/xjjk/healthyclients/fragment/EmergencyFragment.kt +++ b/app/src/main/java/com/xjjk/healthyclients/fragment/EmergencyFragment.kt @@ -180,6 +180,10 @@ class EmergencyFragment : override fun onDestroy() { super.onDestroy() + // 主动停止并销毁定位客户端,防止 Fragment 销毁后 GPS 定位服务持续运行造成资源浪费 + mlocationClient?.stopLocation() + mlocationClient?.onDestroy() + mlocationClient = null mMapView?.onDestroy() } diff --git a/app/src/main/java/com/xjjk/healthyclients/fragment/HomeFragment.kt b/app/src/main/java/com/xjjk/healthyclients/fragment/HomeFragment.kt index cb5a3c1..0f36a8c 100644 --- a/app/src/main/java/com/xjjk/healthyclients/fragment/HomeFragment.kt +++ b/app/src/main/java/com/xjjk/healthyclients/fragment/HomeFragment.kt @@ -32,6 +32,7 @@ import com.xjjk.healthyclients.ui.viewmodel.HomeViewModel import com.xjjk.healthyclients.utils.ConstantUtils import com.xjjk.healthyclients.utils.IMInputActionSettingUtils import com.xjjk.healthyclients.utils.TUIUtils +import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -49,9 +50,11 @@ class HomeFragment : var mGuidanceFragmentDoctorAdapter: GuidanceFragmentDoctorAdapter? = null var REQUEST_DURATION = 1000 * 120L - var noticeTime = REQUEST_DURATION + /** 通知轮播协程 Job,重新启动前先取消旧任务,防止多协程并发叠加 */ + private var noticeJob: Job? = null + override fun initView(root: View?, savedInstanceState: Bundle?) { mBinding.swipeRefresh.initColors() @@ -339,7 +342,9 @@ class HomeFragment : } private fun homeNoticeStartRepeat() { - lifecycleScope.launch { + // 取消旧的轮询协程,防止多次调用时多个协程并发叠加 + noticeJob?.cancel() + noticeJob = lifecycleScope.launch { repeat(500) { mViewModel.getHomeNoticeListRepeat() delay(noticeTime) diff --git a/app/src/main/java/com/xjjk/healthyclients/fragment/WatchItemFragment.kt b/app/src/main/java/com/xjjk/healthyclients/fragment/WatchItemFragment.kt index 352dcef..10b8dce 100644 --- a/app/src/main/java/com/xjjk/healthyclients/fragment/WatchItemFragment.kt +++ b/app/src/main/java/com/xjjk/healthyclients/fragment/WatchItemFragment.kt @@ -3,7 +3,6 @@ package com.xjjk.healthyclients.fragment import android.os.Bundle import android.text.TextUtils import android.view.View -import androidx.fragment.app.Fragment import com.sw.healthyclients.utils.DateUtil import com.xjjk.healthyclients.R import com.xjjk.healthyclients.base.BaseVMBFragment @@ -20,18 +19,25 @@ import com.xjjk.healthyclients.ui.viewmodel.HomeViewModel */ class WatchItemFragment : BaseVMBFragment(R.layout.fragment_item_watch) { - var position: Int? = -1 - fun newInstance(position: Int): Fragment { - val args = Bundle() - args.putInt("position", position) - val fragment = WatchItemFragment() - fragment.arguments = args - return fragment + companion object { + /** + * 创建 WatchItemFragment 实例,通过 arguments 传入 Tab 位置 + * @param position Tab 位置(0=心率 1=血氧 2=压力 3=体温 4=睡眠) + */ + fun newInstance(position: Int): WatchItemFragment { + val args = Bundle() + args.putInt("position", position) + return WatchItemFragment().apply { + arguments = args + } + } } + private var position: Int = -1 + override fun initView(root: View?, savedInstanceState: Bundle?) { - position = arguments?.getInt("position") + position = arguments?.getInt("position") ?: -1 mBinding.watchTypeImg.setImageResource(getWatchTypeImg(position)) if (position != 4) { diff --git a/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt b/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt index a5ae5cd..69dec47 100644 --- a/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt +++ b/app/src/main/java/com/xjjk/healthyclients/view/HomeWatchView.kt @@ -121,7 +121,7 @@ class HomeWatchView(context: Context?, attrs: AttributeSet?) : } override fun createFragment(position: Int): Fragment { - return WatchItemFragment().newInstance(position) + return WatchItemFragment.newInstance(position) } }