未从后台调用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中的MyViewModel
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