没有合适的资源?快使用搜索试试~ 我知道了~
【Android】CalledFromWrongThreadException 深入源码分析
0 下载量 188 浏览量
2021-01-03
19:17:00
上传
评论
收藏 110KB PDF 举报
温馨提示
试读
8页
先上结论 出现此问题的原因是:在非 UI 线程中创建了 Dialog,而在 UI 线程中调用了 show() 方法 问题还原 在使用 dialog 的时候,因为线程问题,在调用 dismiss() 方法的时候,出现如下常见的 crash–Only the original thread that created a view hierarchy can touch its views.,堆栈信息如下: threadName:main,threadPriority:5,threadState:RUNNABLE Caused by: android.view.ViewRootImpl$Called
资源详情
资源评论
资源推荐
【【Android】】CalledFromWrongThreadException 深入源码深入源码
分析分析
先上结论先上结论
出现此问题的原因是:在非 UI 线程中创建了 Dialog,而在 UI 线程中调用了 show() 方法
问题还原问题还原
在使用 dialog 的时候,因为线程问题,在调用 dismiss() 方法的时候,出现如下常见的 crash–Only the original thread that
created a view hierarchy can touch its views.,堆栈信息如下:
threadName:main,threadPriority:5,threadState:RUNNABLE
Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7020)
at android.view.ViewRootImpl.doDie(ViewRootImpl.java:6035)
at android.view.ViewRootImpl.die(ViewRootImpl.java:6020)
at android.view.WindowManagerGlobal.removeViewLocked(WindowManagerGlobal.java:486)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:424)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:126)
at android.app.Dialog.dismissDialog(Dialog.java:363)
....省略部分堆栈
Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
第一反应,觉得在非 UI 线程进行了 UI 操作。
Demo 还原还原
public class MainActivity extends BaseActivity {
private static final String TAG = "MainActivity";
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
// 子线程中创建 Dialog
dialog = new ProgressDialog(MainActivity.this);
dialog.setCanceledOnTouchOutside(true);
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
Log.d("zhangrr", "Dialog onCancel thread: " + getThreadInfo());
}
});
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
Log.d("zhangrr", "Dialog onDismiss thread: " + getThreadInfo());
}
});
dialog.setMessage("dialog test");
Log.d("zhangrr", "Dialog create thread: " + getThreadInfo());
Looper.loop();
}
}).start();
Button btn = (Button) findViewById(R.id.btn_helloworld);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// UI 线程中 show,然后点击空白区域 dismiss
dialog.show();
Log.d("zhangrr", "Dialog show thread: " + getThreadInfo());
weixin_38713203
- 粉丝: 11
- 资源: 942
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
- 关于mybatis的一些相关资源
- 关于mybatist的一些相关资源
- uni-app实战社区交友类app开发&带视频教程
- mybatis动态sql的一些相关资源
- 隐马尔可夫模型在期货市场的应用_曾琦裕 (1).caj
- 极域解控和极域反控!!!
- 安卓android-serialport-api 串口demo源代码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0