PrototypeZ / AppJoint

🔧 Cross module Android development made easy!
764 stars 120 forks source link

AppJoint.service()方法会返回不同的对象 #39

Open turingking opened 4 years ago

turingking commented 4 years ago

使用@ServiceProvider 注解的类有时候会被实例化多次,导致不同的时刻调用 AppJoint.service(A.class) 方法会返回不同的对象。

turingking commented 4 years ago

我把断点打在 AppJoint.class 的101行,发现会执行多次。

    public BinaryKeyMap<Class, String, Object> getRouterInstanceMap() {
        if (softRouterInstanceMap.get() == null) {
            softRouterInstanceMap = new SoftReference<>(new BinaryKeyMap<>());  //这里在初始化的时候会走三次
        }
        return softRouterInstanceMap.get();
    }
turingking commented 4 years ago

初步判断是 SoftReference 被回收的问题 这导致我A页面使用的是一个ServiceImpl对象,B页面使用的是一个新的ServiceImpl对象。

ZhangHowie commented 9 months ago

我也发现了这个问题,就是软引用导致的,系统内存不足会导致软引用被内存回收掉。可能作者没想用到单例模式。但是如果按照单例模式使用就会出现生命周期问题。