AndroidUtilCode icon indicating copy to clipboard operation
AndroidUtilCode copied to clipboard

在自定义View里使用,布局不能预览。

Open SelectSex opened this issue 3 years ago • 4 comments

描述 Bug

自定义view中调用了Utils.getApp()方法,无法预览,搜索别人反馈的无法预览的bug,和我这个不一样

  • AndroidUtilCode 的版本:1.30.6
  • 出现 Bug 的设备型号: studio直接预览报错
  • 设备的 Android 版本:项目编译sdk api 30

相关代码

init {
    Utils.getApp()
}

异常堆栈

Exception Details java.lang.NullPointerException  
 at java.lang.reflect.Method.invoke(Method.java:559)   
 at com.blankj.utilcode.util.UtilsActivityLifecycleImpl.getApplicationByReflect(UtilsActivityLifecycleImpl.java:180)   
 at com.blankj.utilcode.util.UtilsBridge.getApplicationByReflect(UtilsBridge.java:104)   
 at com.blankj.utilcode.util.Utils.getApp(Utils.java:71)

截图

image

分析

在此处调用invoke,会在自定义view中预览时抛出Null异常。

image

invoke 方法会报错

image

报错后未try catch

image

SelectSex avatar Nov 11 '21 16:11 SelectSex

反射没有取到application,是不是还没有初始化

jambestwick avatar Nov 11 '21 17:11 jambestwick

反射没有取到application,是不是还没有初始化

首先需要理解,当前是自定义view在studio的预览,app不会运行,所以初始化无从谈起,这里就是studio执行自定义view代码流程的死板,机械之处。自定义view预览是要执行代码流程的,但是初始化类型的对象,自定义view预览都是默认按照null去执行代码流程的。这个问题,我在自定义view中使用liveeventbus的时候也出现了,无法预览,于是把liveeventbus的aar包反编译后改了反射获取application的代码让,为空不干任何事,编译也通过了,反正反射获取application基本上在真的app运行的时候是不会为空。studio太差劲了

SelectSex avatar Nov 12 '21 07:11 SelectSex

明白了

jambestwick avatar Nov 13 '21 00:11 jambestwick

编辑界面没有Application, 或者说这个Application不是你项目中的Application, 运行的线程也不是SDK中的ActivityThread. 反射都会失效, 同理, 在Android的UnitTest中也不能用项目中的Application, 其实在View中使用Context建议通过View#getContext函数获取View自己的Context

xiexindev avatar Dec 17 '21 04:12 xiexindev