V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
lw10645
V2EX  ›  Android

关于 kotlin 安卓开发,网络框架有用 Retrofit+协程的方式实现的吗,真的好用吗

  •  
  •   lw10645 · May 7, 2021 · 12713 views
    This topic created in 1830 days ago, the information mentioned may be changed or developed.

    刚刚在看相关文章,自己也动手实现了下,发现并不怎么好用啊,还是说我没 get 到

    viewmodel 里面请求接口,结果封装成 sucessLiveData 、errorLiveData 、loadingLiveData,ui 界面监听 livedata 更新 ui

    1.某些接口如果请求失败会把错误数据以 httpexception 的方式返回到客户端,这种方式好像没办法同时兼容统一处理业务的错误数据和 exception 的错误数据

    2.很多页面都是多个请求,单一的 sucessLiveData 、errorLiveData 处理好像并不太优雅

    2 可以通过不同的接口建不同的 livadata 来解决,主要是 1,应该怎么处理呢

    Supplement 1  ·  May 8, 2021
    搞了一天,算是处理好了,参考了楼下几位老哥提的意见,BaseViewModel 无变化,协程放在此处,方便生命周期的管理,同时统一管理 loadingLiveData

    子 viewmodel 调用方法传入请求结果的泛型以及请求函数,成功函数,失败函数,在 BaseViewModel 里面直接获取请求结果,同时增加一个 ResultHelper,将正常结果和异常结果以及成功失败函数体都传入 helper 统一处理结果,这样就兼容处理了业务上的失败和网络请求的失败情况,处理完后执行对应的函数体

    子 viewmodel 里面一个请求一个方法,对应一个或多个 livedata (根据业务需求),对应自己单独的成功失败处理

    Nice~~~
    7 replies    2021-05-08 09:35:59 +08:00
    MarsYan
        1
    MarsYan  
       May 7, 2021
    项目中可以使用协程+Okhttp 自己封装一下,参考 RxHttp
    xloger
        2
    xloger  
       May 7, 2021
    同蹲一个方案。
    我对这块没仔细研究过,当时参考 https://juejin.cn/post/6844904148521992205 封装了一下。不知道还有没有更好的方案。
    kyleLin
        3
    kyleLin  
       May 7, 2021
    反正单一的 success error livedata 这种方式我个人觉得不应该出现,一个接口一个操作对应一个 Livedata 比较好。
    官方也是用密封类去声明 Success,Loading,Fail 等状态,然后通过 livedata 发射出去。
    至于在哪里做状态的发射,我个人是在网络层用 Flow 去做请求,然后 emit 对应的状态,顺带把捕获到的错误做一个统一过滤处理和包装再 emit 出去,然后 ViewModel 可以通过 asLiveData 把请求 Flow 转成 Livedata
    unco020511
        4
    unco020511  
       May 7, 2021
    官方推荐是封装一个包装类,里面包含正常 /异常数据,具体做法是使用密封类,可以去 google 的 github 看一下例子
    cgpiao
        5
    cgpiao  
       May 7, 2021 via Android
    fuel 吧,轻便
    ikas
        6
    ikas  
       May 7, 2021
    本来就是不好用,还有一些坑
    hlayk
        7
    hlayk  
       May 8, 2021
    我就一直用着呢。你可以通过这个官方推荐的 [Resource]( https://developer.android.com/jetpack/guide#addendum) 类去封装请求的返回数据,出现 exception 的时候返回 Resource.Error 就可以了。当然 Resource 类都用 livedata 再封装一次,这样就可以解决你第一个问题了。对于第二个问题就是不同的请求 用不同的 livedata 去接受
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3151 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 14:44 · PVG 22:44 · LAX 07:44 · JFK 10:44
    ♥ Do have faith in what you're doing.