qingmei2 / MVVM-Architecture

The practice of MVVM + Jetpack architecture in Android.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于项目中的一些疑惑

wjploop opened this issue · comments

你好,最近追了你的几篇博客之后,也决定了学习这个项目。为了简单(本人愚钝),我是从"添加异常处理“的版本开始看的,即2018/9/10那天提交的。期间遇到了几个疑惑,劳烦您指点下。

  1. 关于ViewDataBing调试的。在布局文件中data节点中的元素,其创建一般有多个依赖,若其中的依赖有错,编译只告知ViewDataBinding创建失败,没法追溯到错误源,具体是哪个依赖错误导致。 于这点,有什么好的解决办法吗?
  2. 关于本项目中具体的一些细节的。在登录模块中,登录成功View层如何处理结果。

你的实现:

//LoginViewDelegate file
init {
        viewModel.userInfo
                .toFlowable()
                .subscribe { it ->
                    Log.d("tag", it.toString())
                    navigator.toMain()
                }
    }
//

fun <T> LiveData<T>.toFlowable(): Flowable<T> = Flowable.create({ emitter ->
    val observer = Observer<T> { data ->
        data?.let { emitter.onNext(it) }
    }
    observeForever(observer)
   //允许下游叫停流(cancel the flow),或当流中出现错误/完成信号时停止。不知道这里要怎么理解?
    emitter.setCancellable {
        object : MainThreadDisposable() {
            override fun onDispose() = removeObserver(observer)
        }
    }
}, BackpressureStrategy.LATEST)

我想要的实现

//plan A
    init {
        viewModel.userInfo
            .observe(viewModel.lifecycleOwner!!, Observer { //报错,该类初始化时,Activity并没有onCreate()
                navigator.toMain()
            })
    } 
//plan B
    init {
        viewModel.userInfo.observeForever{ //参照你的实现,LIveData无视生命周期,直接添加观察者。问题在于,异步请求返回后的结果,若acitivity不在合适的生命周期内,无法处理结果。
            navigator.toMain()
        }
    }
//plan C
//在LoginViewModel中
    override fun onCreate(lifecycleOwner: LifecycleOwner) {
        super.onCreate(lifecycleOwner)
        userInfo.observe(lifecycleOwner, Observer { 
            //operate the UI
//看到别的Demo中是这么弄的,这样子表达得很清晰。但在ViewModel中操作操作UI,viewModel就要持有context了,突然又觉得你的方案分离出一个ViewDelagate会更清晰了😅
我的想法是,能不能在viewDelegate中监听到onCreate()事件再做相应事件?或是说,我是哪里理解错了?
        })
    }

@wjploop

感谢你这么认真的回复。

关于ViewDataBing调试的。在布局文件中data节点中的元素,其创建一般有多个依赖,若其中的依赖有错,编译只告知ViewDataBinding创建失败,没法追溯到错误源,具体是哪个依赖错误导致。 于这点,有什么好的解决办法吗?

这个我一直都没觉得是很大的问题,因为DataBinding的编译错误会很详细的列在IDE的Log中,当然,随着项目体积的增大,会报很多错误,这个使用多了就知道如何找到真正的错误日志并修改了,就好像Dagger2一样,一开始不熟悉的开发者可能会看着一大堆编译期报错不知所措,用多了,发现错误的修改非常简单,因为IDE已经提示的很详细了。

我的想法是,能不能在viewDelegate中监听到onCreate()事件再做相应事件?或是说,我是哪里理解错了?

这一点你理解的并没有错误,事实上,Google官方对于ViewModel的使用规范的定义就是不要在ViewModel中持有View层的引用。

但是有一点需要确认的是,google的这个规范是基于LiveData+ViewModel的,而RxJava并不能像官方组件一样,默认绑定View层的声明周期——正如你所说,在View层进行观察ViewModel层的状态是一个标准的规范,我进行了适当地修改。

这么做原因是,ViewModel状态和UI的绑定,绝大部分我都交给了DataBinding,很多地方(实际也有,但是我更多用于ViewModel的复用)我不需要再让View层这样去处理:

userInfo.observe(lifecycleOwner, Observer { 
            //operate the UI
 })

这些逻辑我声明在xml中,剩下的代码交给ViewModel内部自己处理就行了——当然,为了保证ViewModel中Rx不会内存泄露,我让ViewModel层持有了LifecycleOwner,这也是我更偏向使用Rx而非Livedata的结果。

官方的代码是标准的使用规范,而我添加了一部分基于这些规范之上的个人思考和尝试——这些异同中,也许有些地方你认为很不错,有些地方你认为不是很好,我都认可,因为这都是对的,代码的本身就代表着不同的**。

这些代码我会在今后不断的实践中修改迭代,也欢迎你的提问以及更多交流 🤝