从前台服务观察 LiveData
Observe LiveData from foreground service
我有一个存储库,其中包含 LiveData 对象并被两者使用
activity 和通过 ViewModel 的前台服务。
当我从 activity 开始观察时,一切都按预期进行。
但是,从服务中观察不会触发 Observe。
这是我使用的代码
class MyService: LifecycleService() {
lateinit var viewModel: PlayerServiceViewModel
override fun onCreate() {
viewModel = MyViewModel(applicationContext as Application)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
viewModel.getLiveData().observe(this, Observer { data ->
// Do something with the data
})
}
}
知道为什么它不起作用并且我没有收到数据吗?
我在 LifecycleActivity
和 Fragments
中使用 ViewModel
和 LiveData
,它按预期工作并观察数据。
针对您的问题,当您从 Service
或任何其他 Activity
创建 new ViewModel
时,它会创建 ViewModel
从存储库和最终 DAO 查询所需的所有 LiveData 和其他依赖项的新实例 。
如果您没有为两个 ViewModel 使用相同的 DAO,您的 LiveData
可能不会更新 ,因为它正在观察 DAO 的 不同 实例。
我在我的项目中使用 Dagger2
来维护 DAO 和其他常见依赖项的 Singleton 实例。因此,您可以尝试使您的存储库和 DAO 单例 以在整个应用程序中保持一致。
我尝试将它与 Services
和 LifecycleService
一起使用,流程相同,它对我有用。
当数据从 null 变为提取数据时,我得到了以下输出
D/ForegroundService: onStartCommand: Resource{status=LOADING, message='null', data=null}
D/ForegroundService: onStartCommand: Resource{status=SUCCESS, message='null', data=TVShow(id=14,...
起初它显示空数据,因为数据不存在于数据库中
从网络中提取数据并更新到数据库后 Observer
自动观察数据。
使用以下代码计算得出
public class ForegroundService extends LifecycleService {
private static final String TAG = "ForegroundService";
private TVShowViewModel tvShowViewModel;
private TVShow tvShow;
@Inject TVShowDataRepo tvShowDataRepo;
@Override
public void onCreate() {
super.onCreate();
AndroidInjection.inject(this);
tvShowViewModel = new TVShowViewModel(tvShowDataRepo);
tvShowViewModel.init(14);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
tvShowViewModel.getTVShow().observe(this, tvShowResource -> {
Log.d(TAG, "onStartCommand: " + tvShowResource);
});
return super.onStartCommand(intent, flags, startId);
}
}
我有一个存储库,其中包含 LiveData 对象并被两者使用 activity 和通过 ViewModel 的前台服务。 当我从 activity 开始观察时,一切都按预期进行。 但是,从服务中观察不会触发 Observe。 这是我使用的代码
class MyService: LifecycleService() {
lateinit var viewModel: PlayerServiceViewModel
override fun onCreate() {
viewModel = MyViewModel(applicationContext as Application)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
viewModel.getLiveData().observe(this, Observer { data ->
// Do something with the data
})
}
}
知道为什么它不起作用并且我没有收到数据吗?
我在 LifecycleActivity
和 Fragments
中使用 ViewModel
和 LiveData
,它按预期工作并观察数据。
针对您的问题,当您从 Service
或任何其他 Activity
创建 new ViewModel
时,它会创建 ViewModel
从存储库和最终 DAO 查询所需的所有 LiveData 和其他依赖项的新实例 。
如果您没有为两个 ViewModel 使用相同的 DAO,您的 LiveData
可能不会更新 ,因为它正在观察 DAO 的 不同 实例。
我在我的项目中使用 Dagger2
来维护 DAO 和其他常见依赖项的 Singleton 实例。因此,您可以尝试使您的存储库和 DAO 单例 以在整个应用程序中保持一致。
我尝试将它与 Services
和 LifecycleService
一起使用,流程相同,它对我有用。
当数据从 null 变为提取数据时,我得到了以下输出
D/ForegroundService: onStartCommand: Resource{status=LOADING, message='null', data=null}
D/ForegroundService: onStartCommand: Resource{status=SUCCESS, message='null', data=TVShow(id=14,...
起初它显示空数据,因为数据不存在于数据库中
从网络中提取数据并更新到数据库后 Observer
自动观察数据。
使用以下代码计算得出
public class ForegroundService extends LifecycleService {
private static final String TAG = "ForegroundService";
private TVShowViewModel tvShowViewModel;
private TVShow tvShow;
@Inject TVShowDataRepo tvShowDataRepo;
@Override
public void onCreate() {
super.onCreate();
AndroidInjection.inject(this);
tvShowViewModel = new TVShowViewModel(tvShowDataRepo);
tvShowViewModel.init(14);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
tvShowViewModel.getTVShow().observe(this, tvShowResource -> {
Log.d(TAG, "onStartCommand: " + tvShowResource);
});
return super.onStartCommand(intent, flags, startId);
}
}