Android 如何在Service中使用ViewModel

需求:最近有反馈说,需要在service中使用网络请求,而我网络请求就是封装的ViewModel。然后我就发现,原来service不支持,懵了呀!哈哈

Android 如何在Service中使用ViewModel_第1张图片

还是去看看ViewModel的源码了解下吧。下面有几个介绍的。就不多做赘述了。有兴趣的自己去看下哈!

ViewModel原理解析,人人都能看得懂! - 知乎

一文带你了解 ViewModel 的使用及源码解析 - 知乎

大致的意思就是:必须依赖于UI界面层。如下图的源码所示。

Android 如何在Service中使用ViewModel_第2张图片

额。。。
然后看了下别人的文章。大致意思就是下面这段话:

ViewModel应该与Activity或Fragment紧密结合使用,因此它注定要存在于应用程序的UI层中。因此,人家不建议在Service中使用ViewModel。可以将Service和ViewModel的公共代码抽出。

具体参考:
https://github.com/android/architecture-components-samples/issues/137#issuecomment-327854042

难道真的没办法了吗?嗯嗯
哪吒不是说:我命有我不由天。人家建议,我们可以不听啊。哈哈!
解决方案如下
    public static MainActivity getInstance() {
        return index;
    }
    private static MainActivity index;
    private final ServiceConnection mTrackConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mapTrackIBinder = (MapTrackService.MapTrackIBinder) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mapTrackIBinder = null;
        }
    };

    @Override
    protected void initUI() {
        index = this;
        // 绑定轨迹服务
        MapTrackService.startService(this);
        Intent trackIntent = new Intent(MainActivity.this, MapTrackService.class);
        mTrackServiceUnbind = bindService(trackIntent, mTrackConnection, BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        index = null;
        if (mTrackServiceUnbind) {
            unbindService(mTrackConnection);
            mTrackServiceUnbind = false;
        }
    }

解决的方法如上图所示,直接引用单例模式,直接在绑定service 的UI界面上做单例,service在UI界面上绑定,在UI界面销毁的时候解除绑定。然后我们就可以在service里面做引用啦。引用的方法如下:

MainActivity.getInstance().viewModel.updataInfo(datas);

确实会比较简单粗暴,但是呢?如果大家有更好的解决方案,欢迎来评论哈。加油,共勉!

参考链接:

Android 在Service中使用ViewModel_android service viewmodel-CSDN博客

你可能感兴趣的:(原创,android,service,vewModel)