feat(service): 使用ViewModelProvider管理ViewModel生命周期
在MainService中实现ViewModelStoreOwner,通过ViewModelProvider创建ViewModel,并在Service销毁时清空ViewModelStore,自动取消RxJava任务,避免内存泄漏。同时添加lifecycle-reactivestreams依赖。
This commit is contained in:
@@ -255,6 +255,8 @@ dependencies {
|
|||||||
implementation "androidx.lifecycle:lifecycle-viewmodel:2.10.0"
|
implementation "androidx.lifecycle:lifecycle-viewmodel:2.10.0"
|
||||||
implementation "androidx.lifecycle:lifecycle-livedata:2.10.0"
|
implementation "androidx.lifecycle:lifecycle-livedata:2.10.0"
|
||||||
implementation "androidx.lifecycle:lifecycle-runtime: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"
|
kapt "androidx.lifecycle:lifecycle-compiler:2.10.0"
|
||||||
// LifecycleService 核心库
|
// LifecycleService 核心库
|
||||||
implementation "androidx.lifecycle:lifecycle-service:2.10.0"
|
implementation "androidx.lifecycle:lifecycle-service:2.10.0"
|
||||||
|
|||||||
@@ -13,8 +13,15 @@ import android.view.MotionEvent;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.lifecycle.Lifecycle;
|
||||||
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
|
import androidx.lifecycle.LifecycleRegistry;
|
||||||
import androidx.lifecycle.Observer;
|
import androidx.lifecycle.Observer;
|
||||||
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
import androidx.lifecycle.ViewModelStore;
|
||||||
|
import androidx.lifecycle.ViewModelStoreOwner;
|
||||||
|
|
||||||
import com.blankj.utilcode.util.NetworkUtils;
|
import com.blankj.utilcode.util.NetworkUtils;
|
||||||
import com.kongzue.dialogx.dialogs.PopTip;
|
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.Logger;
|
||||||
import com.ttstd.dialer.utils.SystemUtils;
|
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";
|
private static final String TAG = "MainService";
|
||||||
|
|
||||||
public static final String SHOW_FLOAT_WINDOW_ACTION = "show_float_window";
|
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 WindowManager.LayoutParams mLayoutParams;
|
||||||
private boolean mFloatWindowShowing = false;
|
private boolean mFloatWindowShowing = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ViewModelStore:Service 销毁时自动清空,从而触发 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
|
@Override
|
||||||
public void onDisconnected() {
|
public void onDisconnected() {
|
||||||
Logger.e(TAG, "onDisconnected: ");
|
Logger.e(TAG, "onDisconnected: ");
|
||||||
@@ -76,8 +105,9 @@ public class MainService extends BaseService implements NetworkUtils.OnNetworkSt
|
|||||||
|
|
||||||
NetworkUtils.registerNetworkStatusChangedListener(this);
|
NetworkUtils.registerNetworkStatusChangedListener(this);
|
||||||
|
|
||||||
// 初始化ViewModel(绑定上下文+View回调)
|
// 通过 ViewModelProvider 创建 ViewModel(由 ViewModelStore 统一管理生命周期,
|
||||||
mViewModel = new MainServiceModel();
|
// 在 Service 销毁时自动触发 ViewModel.onCleared() 取消进行中的 RxJava 任务)
|
||||||
|
mViewModel = new ViewModelProvider(this).get(MainServiceModel.class);
|
||||||
// 注入 Repository(数据访问统一走 Data 层,避免 ViewModel 直接触网)
|
// 注入 Repository(数据访问统一走 Data 层,避免 ViewModel 直接触网)
|
||||||
mViewModel.setSnRepository(SnRepository.getInstance(this));
|
mViewModel.setSnRepository(SnRepository.getInstance(this));
|
||||||
|
|
||||||
@@ -247,6 +277,8 @@ public class MainService extends BaseService implements NetworkUtils.OnNetworkSt
|
|||||||
if (floatingView != null) {
|
if (floatingView != null) {
|
||||||
mWindowManager.removeView(floatingView);
|
mWindowManager.removeView(floatingView);
|
||||||
}
|
}
|
||||||
|
// 清空 ViewModelStore,触发 ViewModel.onCleared(),取消进行中的 RxJava 任务,避免内存泄漏
|
||||||
|
mViewModelStore.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user