240 发简信
IP属地:浙江
  • @忆_析风 onActivityResult之所以设计的如此难用,本质是向安卓恢复机制的妥协。

    因为恢复时activity是新的对象,回调式的写法对于这种场景其实天然的无法支持,回调回来的操作必然是对原对象的操作。导致:

    1.内存泄露(回调中持有已经ondestory的原activity对象,导致无法回收);

    2.回调更新的是原activity对象的数据,重建的activity并得不到这个回调。

    所以安卓源码在设计的时候,是给activity、fragment加了一个统一的onActivityResult的方法,在activity重建的时候,将这个数据回调给新的activity对象,以此达到重建activity场景onActivityResult也能无感知的正常表现。

    个人感觉ResultApi解决的主要问题:原来的onActivityResult导致跳转和接收信息两个阶段完全割裂,跳转的地方完全感知不到接收信息的地方,只能通过一个固定的code关联,这对功能的内聚是个极大的破坏,而借助ResultApi,可以将两者关联起来,也能隐藏其中做映射又毫无意义的requestCode。同时也统一了权限申请这种处于一样窘境的场景。

    由于重建导致无法借助简单回调的情况有很多,比如直接给fragment(或本质是fragment的dialogfragment)设置回调这类场景,在页面重建,dialogfragment自动恢复的场景,由于设置监听的方法的逻辑并没有重新走到,导致监听没赋值而无法回调出去,我们常见但是很不优雅的解决方案也就是给activity继承这个回调接口,直接在dialogfragment中获取当时依附的activity然后强转成这个接口调用对应方法,本质上和onActivityResult的设计方案是一样的。

    目前看起来,只要安卓的重建恢复机制在,这个问题就没有完美的解

    Android Result Api不能在生命周期onStart及之后注册的解决办法

    现在Activity的startActivityForResult废弃了,Google建议我们使用Activity Result Api. 然而这个Activity Resu...

  • @忆_析风 是的,你解释的恰恰是我指出的问题所在。我的意思是,ResultApi标准写法之所以需要在生命周期之前提前注册,就是因为需要保证在重建的时候提前被预注册,因为这个点无法规避,所以api才会设计的这么难用。但是文章这样使用的方式,其实就是埋了一个很大的问题,如果只求简单的回调式,就没必要用ResultApi去实现,通过Glide或者Lifecycler那种插入一个不可见的Fragment代理就可以实现,同时借助Fragment的恢复就可以做到在恢复时恢复之前的监听。我想说的是现在文章的这种做法其实违背了ResultApi的设计初衷,而不是逻辑问题

    Android Result Api不能在生命周期onStart及之后注册的解决办法

    现在Activity的startActivityForResult废弃了,Google建议我们使用Activity Result Api. 然而这个Activity Resu...

  • @忆_析风 这不算逻辑问题,原生的onActivityResult本身不会有问题,ActivtiyResult的标准写法也是预注册,也不会有问题

    Android Result Api不能在生命周期onStart及之后注册的解决办法

    现在Activity的startActivityForResult废弃了,Google建议我们使用Activity Result Api. 然而这个Activity Resu...

  • 想法很好,但是遇到Activity重建恢复的时候,新创建的Activtiy并不会注册,导致页面恢复时,收不到ActivtiyResult回调。原来api强制在onCreate注册,应该也就是这个原因,可以保证新重建的Activtiy也注册,从而能收到ActivityResultCallback

    Android Result Api不能在生命周期onStart及之后注册的解决办法

    现在Activity的startActivityForResult废弃了,Google建议我们使用Activity Result Api. 然而这个Activity Resu...

  • 可是我这边的项目jdk11编译比jdk1.8慢不少,有别的解决方案吗

    Android Studio Dolphin | 2021.3.1 Beta 1 配置java1.8运行项目失败

    * What went wrong: com/android/tools/idea/gradle/run/OutputBuildAction has been compile...

  • 都使用containsAll了还先排序做什么

    kotlin 两个集合内元素是否相同比较

    分别把两个集合排序,然后进行比较

  • 根据网络上各种gradle手动下载配置都没用的,改完配置反而要重新等它下载20分钟,一盘王者荣耀打好了,gradle还没好

  • getAttachCloumnWidth()里面直接用屏幕宽度参与计算,当RecycleView宽度不是屏幕撑满的就没法适配了啊,-40这个是什么意思

    RecyclerView GridLayoutManager item设置万能分隔线

    本来没准备写Android的,在写SoapUI,做项目的时候,遇到了RecyclerView,并且使用GridLayoutManager样式,需要分隔:首尾两列有一定限制的间...

  • https://www.jianshu.com/p/52c767d7f22c
    这个作者的方案还不错,不用自己计算

    两个TextView在同一行优先省略前者

      最近写到一个东西,一行文字里有两个TextView,只有一行,当文字超出时先省略前面的TextView。貌似iOS可以直接设置一个属性,Android中一时找不到设置哪些...

  • 说的清晰明了,感谢

    Android-Handler同步屏障

    一、消息机制之同步屏障 消息机制的同步屏障,其实就是阻碍同步消息,只让异步消息通过。而开启同步屏障的方法就是调用下面的方法: 源码如下: 在这里可以看到,Message对象初...

  • 120
    Android-Handler同步屏障

    一、消息机制之同步屏障 消息机制的同步屏障,其实就是阻碍同步消息,只让异步消息通过。而开启同步屏障的方法就是调用下面的方法: 源码如下: 在这里可以看到,Message对象初...

  • 120
    深入浅出ReentrantLock

    简书 占小狼转载请注明原创出处,谢谢! 前言 java5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁的功能,它提供了与synchronized关键字类似的同步...

  • 深入浅出java同步器AQS

    简书 占小狼转载请注明原创出处,谢谢! 前言 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadW...

  • 仿miui12相册TabLayout

    github地址:zhangjianhd[https://github.com/zhangjianhd]/UiKit[https://github.com/zhangjian...

  • golang切片append

    golang中的数组和其他语言的数组概念差别不大。golang的数组是定长的,初始化之后大小不能发生改变。需要使用变长数组的场景,就需要引入切片切片是某个数组的引用,切片的容...

  • Kotlin 并发

    Kotlin中没有 synchronized 关键字Kotlin中没有 volatile 关键字Kotlin的Any类似于 Java 的 Object , 没有 wait()...