【问题标题】:Access viewModel inside a service in android在android中的服务中访问viewModel
【发布时间】:2020-11-01 00:39:47
【问题描述】:

我们如何在 service 中初始化 viewModel。 在一个片段中,我们使用 Kotlin 委托“by activityViewModels”来做到这一点。 或者我们可以使用 ViewModelProvider().get 来实现。 但据我所知,我们无法在服务中做到这一点,因为我们需要像活动或片段这样的“ViewModelStoreOwner”。

在服务中初始化 ViewModel 是否是最佳实践?

my project here.

【问题讨论】:

  • “因为我需要从我的服务中调用存储库类”——您不需要视图模型来执行此操作。
  • @CommonsWare 是的,你是对的

标签: android mvvm service viewmodel repository-pattern


【解决方案1】:

不建议在服务中使用 ViewModel。您可以从服务本身调用您的存储库。

https://github.com/android/architecture-components-samples/issues/137#issuecomment-327854042

ViewModel 应该与 Activity 或 Fragment 紧密结合使用, 所以它注定要存在于应用程序的 UI 层。 因此,我不建议在服务中使用 ViewModel。创建 一个不同的类,将在服务中使用,如果需要, 在视图模型中。像这样,您可以确保关注点和 避免给 ViewModel 过多的职责。

【讨论】:

    【解决方案2】:

    定义一个基础服务,然后你可以使用 ViewModel 像活动/片段

    public class LifecycleAndViewStoreOwnerService extends LifecycleService implements ViewModelStoreOwner, HasDefaultViewModelProviderFactory {
    
        final ViewModelStore mViewModelStore = new ViewModelStore();
        ViewModelProvider.Factory mFactory;
    
        @NonNull
        @Override
        public ViewModelStore getViewModelStore() {
            return mViewModelStore;
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            getLifecycle().addObserver(new LifecycleEventObserver() {
                @Override
                public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                    if (source.getLifecycle().getCurrentState() == Lifecycle.State.DESTROYED) {
                        mViewModelStore.clear();
                        source.getLifecycle().removeObserver(this);
                    }
                }
            });
        }
    
        @NonNull
        @Override
        public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
            return mFactory != null ? mFactory : (mFactory = new ViewModelProvider.AndroidViewModelFactory(getApplication()));
        }
    }
    

    扩展上面的类,在服务中显示一个覆盖窗口

    public class MyLifecycleService extends LifecycleAndViewStoreOwnerService {
    
        private static final String TAG = "MyLifecycleService";
    
        @Override
        public void onCreate() {
            super.onCreate();
            final OverlayWindowBinding binding = OverlayWindowBinding.inflate(LayoutInflater.from(this));
            binding.setViewModel(new ViewModelProvider(this).get(ViewModel.class));
            binding.setLifecycleOwner(this);
    
            WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            getSystemService(WindowManager.class).addView(binding.getRoot(), layoutParams);
    
            getLifecycle().addObserver(new LifecycleEventObserver() {
                @Override
                public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                    if (source.getLifecycle().getCurrentState() == Lifecycle.State.DESTROYED) {
                        getSystemService(WindowManager.class).removeViewImmediate(binding.getRoot());
                        source.getLifecycle().removeObserver(this);
                    }
                }
            });
        }
    
        public static class ViewModel extends AndroidViewModel {
            public ViewModel(@NonNull Application application) {
                super(application);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多