需求:最近有反馈说,需要在service中使用网络请求,而我网络请求就是封装的ViewModel。然后我就发现,原来service不支持,懵了呀!哈哈
还是去看看ViewModel的源码了解下吧。下面有几个介绍的。就不多做赘述了。有兴趣的自己去看下哈!
ViewModel原理解析,人人都能看得懂! - 知乎
一文带你了解 ViewModel 的使用及源码解析 - 知乎
大致的意思就是:必须依赖于UI界面层。如下图的源码所示。
额。。。
然后看了下别人的文章。大致意思就是下面这段话:
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博客