从前台服务观察LiveData [英] Observe LiveData from foreground service

查看:83
本文介绍了从前台服务观察LiveData的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个存储LiveData对象的存储库,两者都使用 活动和通过ViewModel提供的前台服务. 当我开始观察活动时,一切都会按预期进行. 但是,从服务进行观察不会触发观察. 这是我使用的代码

I have a repository which holds the LiveData object and is used by both activity and a foreground service through a ViewModel. When I start observing from the activity everything works as expected. However observing from the service doesn't trigger the Observe. This is the code I use

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
        })
     }
}

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

Any ideas why it doesn't work and I don't receive the data?

推荐答案

我在LifecycleActivityFragments中将ViewModelLiveData结合使用,它可以正常工作并观察到预期的数据.

I used ViewModel with LiveData in LifecycleActivity and Fragments it works and observes data as expected.

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

Coming to your problem, when you create new ViewModel from Service or any another Activity it creates new instance of all the LiveData and other dependencies required for ViewModel to query from Repository and ultimately DAO. If you are not using the same DAO for both ViewModels your LiveData may not update as it is observing on different instance of DAO.

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

I used Dagger2 in my project to maintain Singleton instances for DAO and other common dependencies. So you can try making your Repository and DAO singleton to keep it consistent across the Application.

我尝试将ServicesLifecycleService一起使用,并且流程相同,并且对我有用.

I tried it using with Services with LifecycleService with same flow and it worked for me.

当数据从null更改为提取数据时,我得到以下输出

I got following output when data changed form null to pulled data

D/ForegroundService: onStartCommand: Resource{status=LOADING, message='null', data=null}
D/ForegroundService: onStartCommand: Resource{status=SUCCESS, message='null', data=TVShow(id=14,...

起初它显示空数据,因为数据库中不存在数据 从网络中提取数据并将其更新到数据库后,Observer会自动观察到数据.

At first it showed null data as data wasn't present in database After pulling data from network and updating into database Observer observed data automatically.

使用以下代码进行锻炼

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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆