feat(service): 使用ViewModelProvider管理ViewModel生命周期

在MainService中实现ViewModelStoreOwner,通过ViewModelProvider创建ViewModel,并在Service销毁时清空ViewModelStore,自动取消RxJava任务,避免内存泄漏。同时添加lifecycle-reactivestreams依赖。
This commit is contained in:
TongTongStudio
2026-08-24 21:33:07 +08:00
parent da3bb3d098
commit 2fc49b917f
2 changed files with 37 additions and 3 deletions

View File

@@ -255,6 +255,8 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-viewmodel:2.10.0"
implementation "androidx.lifecycle:lifecycle-livedata:2.10.0"
implementation "androidx.lifecycle:lifecycle-runtime:2.10.0"
// 可选RxJava3 Observable → LiveData 的桥接
implementation 'androidx.lifecycle:lifecycle-reactivestreams:2.10.0'
kapt "androidx.lifecycle:lifecycle-compiler:2.10.0"
// LifecycleService 核心库
implementation "androidx.lifecycle:lifecycle-service:2.10.0"

View File

@@ -13,8 +13,15 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStore;
import androidx.lifecycle.ViewModelStoreOwner;
import com.blankj.utilcode.util.NetworkUtils;
import com.kongzue.dialogx.dialogs.PopTip;
@@ -33,7 +40,7 @@ import com.ttstd.dialer.manager.MqttManager;
import com.ttstd.dialer.utils.Logger;
import com.ttstd.dialer.utils.SystemUtils;
public class MainService extends BaseService implements NetworkUtils.OnNetworkStatusChangedListener {
public class MainService extends BaseService implements NetworkUtils.OnNetworkStatusChangedListener, ViewModelStoreOwner {
private static final String TAG = "MainService";
public static final String SHOW_FLOAT_WINDOW_ACTION = "show_float_window";
@@ -49,6 +56,28 @@ public class MainService extends BaseService implements NetworkUtils.OnNetworkSt
private WindowManager.LayoutParams mLayoutParams;
private boolean mFloatWindowShowing = false;
/**
* ViewModelStoreService 销毁时自动清空,从而触发 ViewModel.onCleared()
* 保证 ViewModel 内部 RxJava 任务被正确取消,避免内存泄漏。
*/
private final ViewModelStore mViewModelStore = new ViewModelStore();
// ============================================================
// ViewModelStoreOwner 实现
// ============================================================
@NonNull
@Override
public ViewModelStore getViewModelStore() {
return mViewModelStore;
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return super.getLifecycle();
}
@Override
public void onDisconnected() {
Logger.e(TAG, "onDisconnected: ");
@@ -76,8 +105,9 @@ public class MainService extends BaseService implements NetworkUtils.OnNetworkSt
NetworkUtils.registerNetworkStatusChangedListener(this);
// 初始化ViewModel绑定上下文+View回调
mViewModel = new MainServiceModel();
// 通过 ViewModelProvider 创建 ViewModel由 ViewModelStore 统一管理生命周期,
// 在 Service 销毁时自动触发 ViewModel.onCleared() 取消进行中的 RxJava 任务)
mViewModel = new ViewModelProvider(this).get(MainServiceModel.class);
// 注入 Repository数据访问统一走 Data 层,避免 ViewModel 直接触网)
mViewModel.setSnRepository(SnRepository.getInstance(this));
@@ -247,6 +277,8 @@ public class MainService extends BaseService implements NetworkUtils.OnNetworkSt
if (floatingView != null) {
mWindowManager.removeView(floatingView);
}
// 清空 ViewModelStore触发 ViewModel.onCleared(),取消进行中的 RxJava 任务,避免内存泄漏
mViewModelStore.clear();
}
@Override