怎么使用JetPack全局共享数据
来源:1-2 课程介绍及学习指导

默小铭
2022-02-07
场景: 监听手机实时的网络状态
假设我在仓库层定义好了各种获取手机网络状态的方法,然后在ViewModel调用,再用LiveData通知页面更新
但是ViewModel对于activity来说都是独立的,那么我在activityA监听到网络断开的同时打开activityB,B是不知道网络已经断开了的,这种场景该怎么实现呢???
验证过的方案:
- 定义全局的ViewModel (模仿架构课写法,但是没效,不知道是不是写错了)
最想用的方案,但不知道为啥不行
//application
class MyApplication : Application(), ViewModelStoreOwner {
private val appViewModelStore: ViewModelStore by lazy {
ViewModelStore()
}
override fun getViewModelStore(): ViewModelStore {
return appViewModelStore
}
}
//然后在activity调用
private val mViewModel = ViewModelProvider(MyApplication()).get(CounterViewModel::class.java)
- 写一个单例类,定义一个全局都用的LiveData
可行,但不清楚后续会不会有内存持有的问题
object UserInfo {
val mUserModel = MutableLiveData<User>()
}
- 把仓库层扔到application类定义 (参考google官方示例)
这种方式,如果后续全局的仓库层或者数据库多了,感觉会给application增加负担,不知道会不会造成app启动变慢
public class BasicApp extends Application {
private AppExecutors mAppExecutors;
@Override
public void onCreate() {
super.onCreate();
mAppExecutors = new AppExecutors();
}
public AppDatabase getDatabase() {
return AppDatabase.getInstance(this, mAppExecutors);
}
public DataRepository getRepository() {
return DataRepository.getInstance(getDatabase());
}
}
- 自定义EventBus
这种方式如果需要通知多个页面,会导致到处有定义的方法,侵入性太强,不到万不得已,觉得不应该使用
写回答
1回答
-
LovelyChubby
2022-04-02
ViewModelProvider(MyApplication()).get(CounterViewModel::class.java)
这里写错了,MyApplication()相当于new了一个实例对象,这里应该改成application as MyApplication
00
相似问题