从前台服务观察 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
        })
     }
}

知道为什么它不起作用并且我没有收到数据吗?

我在 LifecycleActivityFragments 中使用 ViewModelLiveData,它按预期工作并观察数据。

针对您的问题,当您从 Service 或任何其他 Activity 创建 new ViewModel 时,它会创建 ViewModel 从存储库和最终 DAO 查询所需的所有 LiveData 和其他依赖项的新实例 。 如果您没有为两个 ViewModel 使用相同的 DAO,您的 LiveData 可能不会更新 ,因为它正在观察 DAO 不同 实例。

我在我的项目中使用 Dagger2 来维护 DAO 和其他常见依赖项的 Singleton 实例。因此,您可以尝试使您的存储库和 DAO 单例 以在整个应用程序中保持一致。

我尝试将它与 ServicesLifecycleService 一起使用,流程相同,它对我有用。

当数据从 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);
    }
}