Android ARouter 传值第二次进入页面不生效,自动注入无效

使用Kotlin开发的时候,用ARouter传值跳转页面,进入页面出现第一次自动注入时正常,第二次自动注入无效的问题。
感觉莫名其妙,排查了好久,终于找到了问题,记录一下。

发起跳转是在MainActivity

ARouter.getInstance().build("/app/second")
	.withInt("timeValue", 123)
	.navigation(MainActivity@ this)

我们要跳转的目标页面是SecondActivity

@Route(path = "/app/second")
class SecondActivity : AppCompatActivity() {
  
    @JvmField
    @Autowired
    var timeValue: Int? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        ARouter.getInstance().inject(this)

        findViewById<TextView>(R.id.tv_info).text = "$timeValue"
    }
}

然后,要跳转页面生成的类是SecondActivity$$ARouter$$Autowired

public class SecondActivity$$ARouter$$Autowired implements ISyringe {
  private SerializationService serializationService;

  @Override
  public void inject(Object target) {
    serializationService = ARouter.getInstance().navigation(SerializationService.class);
    SecondActivity substitute = (SecondActivity)target;
    substitute.timeValue = substitute.getIntent().getIntExtra("timeValue", substitute.timeValue);
  }
}

由于getIntExtra传参用的是int

public int getIntExtra(String name, int defaultValue) {
        return mExtras == null ? defaultValue :
        mExtras.getInt(name, defaultValue);
}

所以,使用var timeValue: String? = null没有赋值的情况下,会有报错 java.lang.NullPointerException:cannot unbox null value

导致AutowiredServiceImpl中进入了catch的逻辑

public class AutowiredServiceImpl implements AutowiredService {
    private LruCache<String, ISyringe> classCache;
    private List<String> blackList;

    @Override
    public void init(Context context) {
        classCache = new LruCache<>(66);
        blackList = new ArrayList<>();
    }

    @Override
    public void autowire(Object instance) {
        String className = instance.getClass().getName();
        try {
            if (!blackList.contains(className)) {
                ISyringe autowiredHelper = classCache.get(className);
                if (null == autowiredHelper) {  // No cache.
                    autowiredHelper = (ISyringe) Class.forName(instance.getClass().getName() + SUFFIX_AUTOWIRED).getConstructor().newInstance();
                }
                autowiredHelper.inject(instance); //出现Crash
                classCache.put(className, autowiredHelper);
            }
        } catch (Exception ex) {
           //进入catch逻辑
            blackList.add(className);    // This instance need not autowired.
        }
    }
}

导致第二次进入页面的时候,获取到缓存的AutowiredServiceImpl,这个时候blackList是有存SecondActivity这个className的,导致不会再执行inject方法了。

所以,我们只需要给timeValue赋值一个初始值,就可以解决这个问题了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值