V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lw10645
V2EX  ›  Android

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

  •  
  •   lw10645 · 2021-05-07 15:25:26 +08:00 · 8542 次点击
    这是一个创建于 1295 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    第 1 条附言  ·  2021-05-08 17:43:57 +08:00
    搞了一天,算是处理好了,参考了楼下几位老哥提的意见,BaseViewModel 无变化,协程放在此处,方便生命周期的管理,同时统一管理 loadingLiveData

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

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

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