怎么通过JetPack全局共享数据

来源:12-1 发现Tab总体效果展示&ViewModel新特性

默小铭

2022-02-11

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

假设我在仓库层定义好了各种获取手机网络状态的方法,然后在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类定义 (参考官方示例)

这种方式,如果后续全局的仓库层或者数据库多了,感觉会给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-02-11

class MyApplication : Application(),
ViewModelStoreOwner {

private val appViewModelStore: ViewModelStore by lazy {
    ViewModelStore()
}

override fun getViewModelStore(): ViewModelStore {
     return appViewModelStore
}
}

//然后在activity调用 private val mViewModel = ViewModelProvider(MyApplication(),AndroidViewModelFactory).get(CounterViewModel::class.java)

我本地是有效的,每次去获取到的viewmodel 实例地址都是相同的呢,你使用的lifecycle-viewmodel 版本是多少呢?我这边用的是2.1.0版本的

0
0

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

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

1364 学习 · 607 问题

查看课程