未从后台调用Android ViewModel observer

未从后台调用Android ViewModel observer,android,android-mvvm,Android,Android Mvvm,我正在使用MVVM模式开发小型安卓应用程序。 我的问题是MyActivity中的MyViewModelobserver没有从后台调用。即使应用程序在后台,我也需要调用它,以便向用户显示系统通知,说明应用程序计算过程已完成,结果已准备就绪 这是位于MyActivity中的onCreate中的当前实现: mainActivityViewModel.getTestResult().observe(MainActivity.this, new Observer<String>() {

我正在使用
MVVM
模式开发小型安卓应用程序。 我的问题是MyActivity中的My
ViewModel
observer没有从后台调用。即使应用程序在后台,我也需要调用它,以便向用户显示系统
通知
,说明应用程序计算过程已完成,结果已准备就绪

这是位于
MyActivity
中的
onCreate
中的当前实现:

mainActivityViewModel.getTestResult().observe(MainActivity.this, new Observer<String>() {
        @Override
        public void onChanged(@Nullable String blogList) {
            Toast.makeText(getApplicationContext(), "test...", Toast.LENGTH_SHORT).show();
            if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)){
                //The app is in foreground - showDialog
            }else{
                //The app is in background - showNotification
            }
        }
mainActivityViewModel.getTestResult().observe(MainActivity.this,new Observer()){
@凌驾
公共void onChanged(@Nullable String blogList){
Toast.makeText(getApplicationContext(),“test…”,Toast.LENGTH\u SHORT.show();
if(getLifecycle().getCurrentState().IsAtlast(Lifecycle.State.Resume)){
//应用程序位于前台-showDialog中
}否则{
//应用程序位于后台-showNotification
}
}

目前,只有在应用程序位于前台时才会调用此观察者-如果在应用程序位于前台时完成此过程-“showDialog”将触发,如果应用程序位于后台-showNotification将触发-但只有在我再次打开应用程序后才会触发。这不是我试图实现的行为。请帮助!谢谢。

onChang只有当
活动
的当前
生命周期
状态至少为
已启动
时,才会调用ed
,当您离开
活动
,这意味着它至少未启动

LiveData
根本不适合您试图实现的行为

我建议您改用前台
服务
。特别是如果用户应该知道所提到的“计算过程”

编辑: 假设您正在后台执行一些可能会长期运行的任务,并且即使用户将离开或关闭您的
活动
,您也希望继续此任务。那么使用
服务
是一个不错的选择,尤其是前台
服务
,如果该任务是用户操作的结果。例如用户单击“上载”按钮,前台的
服务执行任务,相关的
通知显示“正在上载”

你可以选择其中之一

  • 任务完成后,始终显示新的
    通知
    ,无论是否显示
    活动
    。这非常常见
  • 仅当
    活动
    当前未启动时才显示
    通知
    ,如果已启动,则在
    活动
    视图中显示内容
为了执行后一个选项,您需要知道
活动
生命周期
的当前状态。您希望能够以某种方式从您的服务执行以下检查:
getLifecycle().getCurrentState().isatalast(Lifecycle.State.RESUMED)

活动
服务
之间进行通信的最佳方式是访问
服务
并扩展服务中的
活页夹


绑定后,您可以将
活动
生命周期
状态存储在
服务
中的一个变量中,甚至可以将
活动
本身提供给
服务
您尝试做的事情是可能的,但不是您正在做的事情

LiveData
API的全部目的是以生命周期感知的方式将数据层与UI链接起来,因此当应用程序不在前台时,观察者就会知道这一点并停止更新UI

观察者的第一个参数是生命周期

这是一个很大的改进,因为没有它,由于UI不可用而导致的崩溃太频繁,或者太复杂而无法手动控制(样板文件、边缘案例等)

服务不是一个好主意,因为如果前台应用程序需要内存,DALVIK或ANT机器可能会杀死这些服务。服务不在前台,但这并不意味着它们绑定到后台,也不意味着它们保证在不确定的时间跨度内工作

如果要执行您希望执行的操作,请使用。WorkManager允许您在有条件或无条件的情况下安排作业,然后您可以向用户发送通知

您可以尝试将Workmanager和Viewmodel结合起来,以实现前台/后台应用程序功能

为此,请使用活动生命周期:

  • 使用onResume方法删除使用ViewModel的任何WorkManager和star
  • 使用onPause方法启动WorkManager

我猜您的视图模型中的
getTestResult()
返回了一些实时数据

因此,首先,您要使用
.setValue(一些数据)
方法为真实数据分配LiveData。当应用程序处于后台时,当应用程序处于打开状态时,它工作正常。您需要使用
.postValue(一些数据)
方法为数据分配LiveData

检查以下差异:

设置值。如果存在活动的观察者,则将值分派给他们。必须从主线程调用此方法

将任务发布到主线程以设置给定值。如果在主线程执行发布的任务之前多次调用此方法,则只会调度最后一个值

结论:关键区别在于:


必须从主线程调用setValue()方法。但是如果需要从后台线程设置值,则应使用postValue()。

你不能这样做,android就是这样工作的……但是你可以尝试使用前台服务。请详细说明一下。什么样的服务?谢谢。Hi@Isa