[Bug]:EasyWindow的mDecorView对象丢失,在findViewById的时候空指针
框架版本【必填】
v10.3
问题描述【必填】
1|Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference -- 2 | at com.hjq.window.EasyWindow.findViewById(EasyWindow.java:1023)复现步骤【必填】
1、复写BaseDraggable类,实现自己的悬浮窗拖拽逻辑; 2、在onTouch方法中,使用EasyWindow.findViewById方法,会报空指针;
是否必现【必填】
否
项目 targetSdkVersion【必填】
30
出现问题的手机信息【必填】
aln-al80
出现问题的安卓版本【必填】
harmony_os(4.2.0)、android(13)
问题信息的来源渠道【必填】
No response
是部分机型还是所有机型都会出现【必答】
huawei(aln-al80) harmony_os(4.2.0)出现概率最高
框架最新的版本是否存在这个问题【必答】
是
框架文档是否提及了该问题【必答】
否
是否已经查阅框架文档但还未能解决的【必答】
是
issue 列表中是否有人曾提过类似的问题【必答】
否
是否已经搜索过了 issue 列表但还未能解决的【必答】
是
是否可以通过 Demo 来复现该问题【必答】
否
提供报错堆栈
1
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
2
at com.hjq.window.EasyWindow.findViewById(EasyWindow.java:1023)
3
at com.hjq.window.EasyWindow.setText(EasyWindow.java:1065)
4
at com.sino.frame.home.ui.vm.CGMRecordModel$setCGMDataObserver$1$1$2.invokeSuspend(CGMRecordModel.kt:539)
5
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:30)
6
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
7
at com.openrum.sdk.agent.engine.external.AsynchronousInstrumentation$BrRunnable.run(SourceFile:34)
8
at android.os.Handler.handleCallback(Handler.java:900)
9
at android.os.Handler.dispatchMessage(Handler.java:103)
10
at android.os.Looper.loop(Looper.java:219)
11
at android.app.ActivityThread.main(ActivityThread.java:8673)
提供截图或视频
No response
提供解决方案
No response
关于这种没有复现步骤的问题,我无法判定到底是谁的问题(框架的问题,系统的问题,厂商的问题,个人写法的问题),你需要确定好清楚问题复现步骤或者问题的具体原因,否则你只能自行处理。
复现步骤: 1、系统悬浮窗,设置setDraggable, EasyWindow .with(BaseApplication.application) .setGravity(Gravity.END) .setContentView(R.layout.home_window_cgm) .setDraggable(CustomSpringDraggable()) 并保存为一个静态变量floatWindow; 2、在一个静态方法中,使用这个静态变量,去设置自定义布局的属性,EasyWindow.setText,然后发现根布局为空; 3、报错空指针:
| 1 | Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference |
|---|---|
| 2 | at com.hjq.window.EasyWindow.findViewById(EasyWindow.java:1023) |
你的复现步骤比较复杂,不要光用文字来描述,不然很可能出现的一种情况就是我按照你说的结果无法复现,这种情况我遇到过很多次,正确的做法是直接写一个 Demo 工程上传到 Github issue,我直接跑 Demo 工程来复现。
不是必现的问题,阿里云崩溃日志统计出来的,目前看估计是存储在静态变量里面,导致根布局丢失导致,我每次调用findViewById前判断一下根布局是否还在吧,感谢。
EasyWindow ob = EasyWindow.with(application); ob.setContentView(R.layout.window_phone) .setGravity(Gravity.END | Gravity.BOTTOM) .setYOffset(200) // 设置指定的拖拽规则 .setDraggable(springBackDraggable) /* .setOnClickListener(android.R.id.icon, new EasyWindow.OnClickListener<ImageView>() {
@Override
public void onClick(EasyWindow<?> easyWindow, ImageView view) {
Toaster.show("我被点击了");
// 点击后跳转到拨打电话界面
// Intent intent = new Intent(Intent.ACTION_DIAL);
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// toast.startActivity(intent);
// 安卓 10 在后台跳转 Activity 需要额外适配
// https://developer.android.google.cn/about/versions/10/privacy/changes#background-activity-starts
}
})*/
.show();
TextView tv = (TextView) ob.findViewById(R.id.tv);
tv.setText("我改变其值");
这样去找值,EasyWindow.with貌似又创建了一个对象在调用Find是会空
mDecorView 变量只有三种情况,第一种肯定不为空,第二种你没有设置,最有可能就是第三种,EasyWindow 被回收了,你还去调用 findViewById 方法,所以就会出现为空的情况
我在下个版本优化一下这个问题,避免外部调用导致内部出现空指针
该问题已经被优化,更新到最新版本即可解决。