Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于BaseRepo和BaseViewModel中launch函数的封装 #11

Open
QuincyJiang opened this issue Apr 27, 2021 · 4 comments
Open

关于BaseRepo和BaseViewModel中launch函数的封装 #11

QuincyJiang opened this issue Apr 27, 2021 · 4 comments

Comments

@QuincyJiang
Copy link

首先赞一下大佬掘金的两篇高质量文章。
看了下代码,对launch{}这个封装 有几个小建议:
一是 Dispatcher建议手动传入,这样使用者更明确block: suspend () -> T的执行环境
二是 success和error这两个callback的线程环境建议统一下,比如要么与block: suspend () -> T 相同,要么统一切换到主线程。
三是

onFailure {
                it.printStackTrace()
                getApiException(it).apply {
                    error?.invoke(this)
                    toast(errorMessage)
                    //统一响应错误信息
                    errorLiveData.value = this
                }
            }

这里 toast(errorMessage) errorLiveData.value = this 可能有bug哈 建议用withContext(Dispatchers.Main.immediate) 包一下

@zskingking
Copy link
Owner

首先赞一下大佬掘金的两篇高质量文章。
看了下代码,对launch{}这个封装 有几个小建议:
一是 Dispatcher建议手动传入,这样使用者更明确block: suspend () -> T的执行环境
二是 success和error这两个callback的线程环境建议统一下,比如要么与block: suspend () -> T 相同,要么统一切换到主线程。
三是

onFailure {
                it.printStackTrace()
                getApiException(it).apply {
                    error?.invoke(this)
                    toast(errorMessage)
                    //统一响应错误信息
                    errorLiveData.value = this
                }
            }

这里 toast(errorMessage) errorLiveData.value = this 可能有bug哈 建议用withContext(Dispatchers.Main.immediate) 包一下

首先非常感谢您提的建议,这对我非常有用。
关于第一点:为了过度简化代码我将Dispatcher .IO写在了Repo里,通过BaseViewModel建立主线程协程作用域。不过你说的对,我应该把Dispatcher暴露出来,这样会更加灵活。

关于第二点和第三点我跟你意见基本一致,所以我本地已经标了Deprecated,很快就会被剔除

@zskingking
Copy link
Owner

首先赞一下大佬掘金的两篇高质量文章。
看了下代码,对launch{}这个封装 有几个小建议:
一是 Dispatcher建议手动传入,这样使用者更明确block: suspend () -> T的执行环境
二是 success和error这两个callback的线程环境建议统一下,比如要么与block: suspend () -> T 相同,要么统一切换到主线程。
三是

onFailure {
                it.printStackTrace()
                getApiException(it).apply {
                    error?.invoke(this)
                    toast(errorMessage)
                    //统一响应错误信息
                    errorLiveData.value = this
                }
            }

这里 toast(errorMessage) errorLiveData.value = this 可能有bug哈 建议用withContext(Dispatchers.Main.immediate) 包一下

欢迎以后多提建议啊,大家共同进步。 ~_~

@showdy
Copy link

showdy commented May 6, 2021

BaseRepo里面个人认为使用flow代替livedata是否更合适。

@zskingking
Copy link
Owner

BaseRepo里面个人认为使用flow代替livedata是否更合适。

关于flow现在还在了解阶段,后面会考虑引入

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants