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

RxActivityResult

  •  
  •   nekocode · 2017-03-18 03:15:17 +08:00 · 9678 次点击
    这是一个创建于 2809 天前的主题,其中的信息可能已经有所发展或是发生改变。

    调研过已有的类似的两个开源库:

    比较遗憾的是它们实现的方式比较重,都是利用 ShadowActivityHolderActivity 来进行 onActivityResult() 的代理。

    使用代理 Activity 的方式太过消耗资源了,而且你每次调用 startActivityResult() 都会新建一次代理 Activity,这真是 WTF !

    更好的方式是使用 Headless Fragment 来进行代理(我之前写的 rxlifecycle 也是类似的实现)。它的好处在于足够轻量级,每个 Activity 或 Fragment 在调用 startActivityResult() 只会新建唯一一个 Fragment


    Github Repo :RxActivityResult

    欢迎 Star~

    13 条回复    2017-03-18 20:01:45 +08:00
    29995270
        1
    29995270  
       2017-03-18 07:53:10 +08:00 via Android
    ForResult 拼成 fro Result 是故意的还是拼错了
    KNOX
        2
    KNOX  
       2017-03-18 08:13:59 +08:00 via Android
    @29995270 拼错很正常,没必要猜测是故意的。
    29995270
        3
    29995270  
       2017-03-18 08:22:00 +08:00 via Android
    @KNOX 问题是全都写成了 froResult 啊,我哪知道作者是不是另有深意
    29995270
        4
    29995270  
       2017-03-18 08:24:09 +08:00 via Android
    也许作者是为了方便 static import 吧
    xingda920813
        5
    xingda920813  
       2017-03-18 10:14:09 +08:00
    感觉 EventBus 用的多一些, 用 result 传值比较少用.
    nekocode
        6
    nekocode  
    OP
       2017-03-18 10:27:25 +08:00
    @29995270
    是我拼错了。。已 Fix (深夜敲代码,没仔细检查)

    @xingda920813
    `startActivityForResult()` 是系统通用的函数,你可以用它打开其它应用的 Activity 并捕获结果。显然 EventBus 并不能。而且尽管在应用内用 EventBus 来广播 Result ,也不是一种好的设计。
    xingda920813
        7
    xingda920813  
       2017-03-18 10:47:17 +08:00
    @nekocode

    你说打开其他应用的页面的话,那是没错,但这种情况在开发中稍少一些吧,打开本应用的页面多一些。

    另外 , EventBus 不要求 Result 支持序列化; EventBus 还可以一个页面发送事件,多个页面接收事件;它的使用范围也不止局限在 Activity 之间,普通的 Java 类之间也可以。感觉它的适用范围更广一些,可以将这 1 种方式普遍用于组件间通讯的解耦 (非 IPC)。

    求解为什么广播 Result 不是一个好的设计?
    nekocode
        8
    nekocode  
    OP
       2017-03-18 11:12:29 +08:00   ❤️ 1
    @xingda920813

    讲真,不要太依赖 EventBus ,能用系统提供的方法就用系统提供的方法。

    EventBus 关注的是广播,发布的是任何组件(甚至非组件)都能捕获到的消息,你需要甄别不同来源的话,依旧得为消息带上 Request Code (或其它标明来源的信息)。

    另外你对序列化貌似有偏见。系统在很多地方需要你的数据支持可序列化接口是有原因的,一来方便 IPC ,二来是要解决你组件随时被销毁而丢失数据的风险。
    xingda920813
        9
    xingda920813  
       2017-03-18 11:18:12 +08:00
    @nekocode 学习了, 当时没怎么思考.
    little_cup
        10
    little_cup  
       2017-03-18 11:44:16 +08:00 via Android
    其实贵司内部的 xxxCamera 模块也是用的一样的原理实现,但由于 4.x singleInstance activity 的原因, AgentActivity 是避免不了的...
    nekocode
        11
    nekocode  
    OP
       2017-03-18 12:12:12 +08:00
    @little_cup

    看了下还真是,可惜不是 Rx Style 的接口。
    little_cup
        12
    little_cup  
       2017-03-18 12:30:49 +08:00
    @nekocode 惭愧,写的时候我对 Rx 还不太熟…如果下周 task 少的话我改一把
    ztaober
        13
    ztaober  
       2017-03-18 20:01:45 +08:00
    star
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2602 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 15:40 · PVG 23:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.