怎么使用JetPack全局共享数据

来源:1-2 课程介绍及学习指导

默小铭

2022-02-07

场景: 监听手机实时的网络状态

假设我在仓库层定义好了各种获取手机网络状态的方法,然后在ViewModel调用,再用LiveData通知页面更新

但是ViewModel对于activity来说都是独立的,那么我在activityA监听到网络断开的同时打开activityB,B是不知道网络已经断开了的,这种场景该怎么实现呢???

验证过的方案:

  1. 定义全局的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)

  1. 写一个单例类,定义一个全局都用的LiveData

可行,但不清楚后续会不会有内存持有的问题

object UserInfo {
    val mUserModel = MutableLiveData<User>()
}
  1. 把仓库层扔到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());
    }
}
  1. 自定义EventBus

这种方式如果需要通知多个页面,会导致到处有定义的方法,侵入性太强,不到万不得已,觉得不应该使用

写回答

1回答

LovelyChubby

2022-04-02

ViewModelProvider(MyApplication()).get(CounterViewModel::class.java)

这里写错了,MyApplication()相当于new了一个实例对象,这里应该改成application  as  MyApplication

0
0

开发商业级热门短视频App 掌握Jetpack组件库

Jetpack架构大揭秘,全组件实战主流且功能完整的短视频App

1364 学习 · 607 问题

查看课程