hegaojian / MvvmHelper

:chicken::basketball:这是一个快速开发的框架,Kotlin语言开发,MVVM+Jetpack架构,封装了公共头部、界面状态管理、ViewModel、LiveData、DataBinding、ViewBinding头部刷新、加载更多、沉浸式、全局通知、丰富好用的拓展函数、RxHttp网络请求等等一系列工具
Apache License 2.0
417 stars 60 forks source link

拜读了代码之后,有几个问题和建议。 #6

Closed bingdu0 closed 3 years ago

bingdu0 commented 3 years ago

老哥,你这个启动图着实骚到我了,看完代码之后 ,我有几个建议和问题想请教下: 1.Android 启动优化AnchorsManager 可以尝试一下App Startup。 2.能否添加Room 数据库的一些使用,这样一来也可以完善MVVM 的Repository 层也有所体现。 3.保持这个第三方库版本的更新。 4.NetCallbackExt.kt 这个类 如果是串行请求和并行请求怎么处理? 最后 感谢作者的开源。

hegaojian commented 3 years ago

1.App Startup后面我去看看,用着方便的话可以替换掉现有的 2.Room因为我在商业项目中并没有实践过,用的不太熟练,如果依葫芦画瓢,我怕会对大家造成误导,所以暂时先没加,后期会考虑加上的 3.这个开源项目会一直更新维护的,毕竟公司现在的项目就是用的这个 4.串行请求和并行请求可以参考 LoginViewModel中的并行示例 请求默认是串行比如

/**
     * 演示一个串行请求 写法
     * @param phoneNumber String
     * @param password String
     */
    fun test1(phoneNumber: String, password: String) {
        rxHttpRequest {
            onRequest = {
                //下面2个接口串行请求,先请求登录接口,根据登录接口返回的数据再调用下一个接口
                val loginData = UserRepository.login(phoneNumber, password).await()
                if(loginData.admin){
                    //如果是 管理员 那么就请求
                    val listData = UserRepository.getList(0).await()
                    //打印一下
                    listData.size.logD()
                }
            }
            loadingType = LoadingType.LOADING_DIALOG
            loadingMessage = "正在登录中....." // 选传
            requestCode = NetUrl.LOGIN // 如果要判断接口错误业务 - 必传
        }
    }

并行请求 比如

/**
     * 演示一个并行 请求 写法
     * @param phoneNumber String
     * @param password String
     */
    fun test2(phoneNumber: String, password: String) {
        rxHttpRequest {
            onRequest = {
                //下面2个接口同时请求,最后合并值 其中有任一接口请求失败都会走错误回调
                val listData = UserRepository.getList(0).async(this)
                val loginData = UserRepository.login(phoneNumber, password).async(this)
                //得到合并值
                val mergeValue = loginData.await().username + listData.await().hasMore()
                //打印一下
                mergeValue.logA()
            }
            loadingType = LoadingType.LOADING_DIALOG
            loadingMessage = "正在登录中....." // 选传
            requestCode = NetUrl.LOGIN // 如果要判断接口错误业务 - 必传
        }
    }

最后,非常感谢你的建议 :smiley::smiley::smiley:

bingdu0 commented 3 years ago

1.App Startup后面我去看看,用着方便的话可以替换掉现有的 2.Room因为我在商业项目中并没有实践过,用的不太熟练,如果依葫芦画瓢,我怕会对大家造成误导,所以暂时先没加,后期会考虑加上的 3.这个开源项目会一直更新维护的,毕竟公司现在的项目就是用的这个 4.串行请求和并行请求可以参考 LoginViewModel中的并行示例 请求默认是串行比如

/**
     * 演示一个串行请求 写法
     * @param phoneNumber String
     * @param password String
     */
    fun test1(phoneNumber: String, password: String) {
        rxHttpRequest {
            onRequest = {
                //下面2个接口串行请求,先请求登录接口,根据登录接口返回的数据再调用下一个接口
                val loginData = UserRepository.login(phoneNumber, password).await()
                if(loginData.admin){
                    //如果是 管理员 那么就请求
                    val listData = UserRepository.getList(0).await()
                    //打印一下
                    listData.size.logD()
                }
            }
            loadingType = LoadingType.LOADING_DIALOG
            loadingMessage = "正在登录中....." // 选传
            requestCode = NetUrl.LOGIN // 如果要判断接口错误业务 - 必传
        }
    }

并行请求 比如

/**
     * 演示一个并行 请求 写法
     * @param phoneNumber String
     * @param password String
     */
    fun test2(phoneNumber: String, password: String) {
        rxHttpRequest {
            onRequest = {
                //下面2个接口同时请求,最后合并值 其中有任一接口请求失败都会走错误回调
                val listData = UserRepository.getList(0).async(this)
                val loginData = UserRepository.login(phoneNumber, password).async(this)
                //得到合并值
                val mergeValue = loginData.await().username + listData.await().hasMore()
                //打印一下
                mergeValue.logA()
            }
            loadingType = LoadingType.LOADING_DIALOG
            loadingMessage = "正在登录中....." // 选传
            requestCode = NetUrl.LOGIN // 如果要判断接口错误业务 - 必传
        }
    }

最后,非常感谢你的建议 😃😃😃

懂了 ,感谢作者回复,我现在用作者的框架用到自己的项目中。还有几个问题需要跟作者请教下: 1.对于业务逻辑是写在ViewModel中还是Repository 中?我看目前的Repository 只是用于请求网络数据。怎么才能区分出是UI逻辑还是业务逻辑。

2.dimens 文件中有的是dp.1 ,有的是dp14 有的是. 有的是

3.mToolbar 这个标题栏和ImmersionBar 状态栏 最好是分离,每个页面的标题栏 颜色都不一样。

zanjs commented 3 years ago

very nice

hegaojian commented 3 years ago

1.我在现在的项目开发中,为了开发更快更爽,再不涉及到多种数据源(网络、数据库、本地缓存)得情况下,Repository我都不要了,网络请求直接写在ViewModel中比如:

/**
     * @param phoneNumber String
     * @param password String
     */
    fun test1(phoneNumber: String, password: String) {
        rxHttpRequest {
            onRequest = {
                loginData.value = RxHttp.postForm(NetUrl.LOGIN)
                             .add("username", phoneNumber)
                             .add("password", password)
                             .toResponse<UserInfo>() .await()
            }
            loadingType = LoadingType.LOADING_DIALOG
            loadingMessage = "正在登录中....." // 选传
            requestCode = NetUrl.LOGIN // 如果要判断接口错误业务 - 必传
        }
    }

具体的逻辑还是在Activity/Fragment中,有点代码一把嗦的感觉,可能不够规范,但是我用着确实舒服 2.dimens 文件中有的是dp.1 ,有的是dp14 有的是. 有的是 这个好像是引入的第三方库的锅,他们的库中定义了dimens 3.mToolbar 这个建议是可以的,是要分离一下,虽然我自己的项目中是统一标题栏,但是既然开源出来了,需要考虑到多种情况

hegaojian commented 3 years ago

第一个问题,你有更好的建议可以分享出来 @bingdu0

bingdu0 commented 3 years ago

第一个问题,任何应用编写方式都不可能是每种情况的最佳选择。google 推荐的架构,也只适合大多数情况。但是有总比没有强。所以说我们还是要遵从一下。建议还是在代码中来约束开发来写Repository 层,业务逻辑代码写在ViewModel 中,Repository 层的复用。其实作为开发人员,只有我们团队 或者是个人能看到代码层,所以说该严格还是要严格一下。以上是个人的建议,也希望能和作者以及大家一起讨论学习。

zhongmichael commented 3 years ago

你好 ~并行请求这种一个请求失败了 都失败了 能不能做成rxjava操作符这种效果