bug--常见的bug总结:

新手总结的开发中所遇到错误及解决办法,如有不对,欢迎指正,如有更好的解决办法,也请不吝赐教。

一、dialog.show()引起的android.view.WindowManager$BadTokenException错误
错误日志

android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:653)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
at android.view.Window$LocalWindowManager.addView(Window.java:558)
at android.app.Dialog.show(Dialog.java:316)
错误原因
错误原因是Dialog在show的时候必须要有一个activity作为窗口载体,上面的日志的意思是承载Dialog的activity已经被销毁了,不存在了

解决办法
1、在show之前加判断activity是否被销毁了
if(!isFinishing()){
dialog.show();
}

2、直接try catch(不推荐)

错误日志
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
错误原因
先说说上下文的使用, 对话框它是我们的Activity的一部分,对话框它挂载在我们的Activity上;
getApplicationContext()这个方法得到的是Context,
Activity.this 得到Context的一个子类,也就是说 Activity.this 相当于是getApplicationContext()的子类.
父类有的子类一定有 - 没有 token
子类有的父类不一定有 --有 token
this 还有Activity.this和我们的getApplicationContext();
大多数情况推荐:Activity.this
解决办法: 上下文大多数情况推荐:Activity.this

二、dialog.dismiss()引起的java.lang.IllegalArgumentException错误

错误日志
?
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:383)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:285)
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:104)
at android.app.Dialog.dismissDialog(Dialog.java:332)
at android.app.Dialog.dismiss(Dialog.java:315)

错误原因
这个错误测试是测不出来的,我是加了第三方的错误统计才得以发现的,原因是由于某种原因导致Activity被杀死后又重新创建
常发生这类Exception的情形都是,有一个费时的线程操作,需要在显示一个ProgressDialog,在任务开始的时候显示一个对话框,然后当任务完成了再Dismiss对话框,如果在此期间如果Activity因为某种原因被杀掉且又重新启动了,那么当Dismiss的时候WindowManager检查发现Dialog所属的Activity已经不存在了,所以会报IllegalArgumentException: View not attached to window manager.
解决办法
从网上找了好些解决方案都不是太理想,然后就尝试着自己解决, 我是这么解决的,反正加上之后这个错误就没有再出现过,如有不对还请赐教。
重写Activity的onDestroy,将dialog置为空。
?
@Override
public void onDestroy() {
super.onDestroy();
dialog=null;
}

三、读取通讯录时,用户选择拒绝,未能获取权限导致的java.lang.SecurityException: Permission Denial错误
错误日志
?
java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/data/phones from pid=27697, uid=10194 requires android.permission.READ_CONTACTS, or grantUriPermission()
at android.os.Parcel.readException(Parcel.java:1465)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:413)
at android.content.ContentResolver.query(ContentResolver.java:470)
at android.content.ContentResolver.query(ContentResolver.java:413)
错误原因:
读取通讯录时,用户选择拒绝,未能获取权限
解决办法:
直接try catch 如果捕获到异常,提示用户未授于权限。

四、拨打电话时,手机没有相关应用程序导致的android.content.ActivityNotFoundException错误,用浏览器打开网页链接时,若没有安装浏览器,也会产生类似的错误,解决办法一样
错误日志
?
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.DIAL dat=tel:xxxxxxxxxxxx }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1632)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1424)
at android.app.Activity.startActivityForResult(Activity.java:3438)
at android.app.Activity.startActivityForResult(Activity.java:3399)
错误原因
因为手机没有安装可以拨打电话的应用程序
解决办法:
直接try catch 如果捕获到异常,提示用户没有相关的应用程序处理此操作。

五、在子线程,更新UI
错误日志
?
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5281)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:943)
at android.view.View.requestLayout(View.java:15614)
at android.view.View.requestLayout(View.java:15614)

错误原因
在子线程显示一个Toast,更新UI只能在主线程中进行
解决办法
1、使用Looper
?
Looper.prepare();
Toast.makeText(aActivity.this,"test",Toast.LENGTH_SHORT).show();
Looper.loop();

2、使用Handler
在类中定义
?
private final Handler msgHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.arg1) {
case R.string.msg_not_network:
Toast.makeText(getApplicationContext(), getResources().getString(R.string.msg_not_network), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};

在子线程中,发送消息
Message msg = msgHandler.obtainMessage();
msg.arg1 = R.string.msg_not_network;
msgHandler.sendMessage(msg);

时间: 2024-10-06 03:20:28

bug--常见的bug总结:的相关文章

QT环境搭建常见的bug解决 -->ld: cannot find –lbootstrap 错误

常见错误列表 一.编译arm环境的时候: ./configure -prefix $HOME/Qtenv/arm -embedded arm-nomake docs -nomake demo -nomake examples 1.configure完成之后,make出现问题:/usr/bin/ld: cannot find –lbootstrap 错误 解决方法:提示找不到bootstrap库,而实际的qt中是由这个库的,就在src/tools/bootstrap/目录下,可以通过如下命令手动编

常见浏览器bug(针对IE6及更低版本)及其修复方法

常见bug及其修复方法有以下几种 1.双外边距浮动bug 双外边距浮动bug在IE6及更低版本中常见.所谓双外边距浮动bug是指使任何浮动元素上的外边距加倍.(见下图) 只要将元素的display属性设置成inline就行了.因为元素时浮动的,所以将display属性设置为inline实际上不会影响显示方式.但是,这似乎会阻止Windows上的IE6及更低版本将所有外边距加倍.所以每当对具有水平外边距的元素浮动时,都应该很自然的将display属性设置为inline,以备外边距将来被加大. 2.

ie6下常见的bug 调整页面兼容性

ie6下常见的bug 我们布局页面,首先符合标准,如何写一个页面的标准性? 但是ie6等浏览器本身就比较特殊,bug比较多,兵法云,知己知彼百战百胜.我们需要了解ie6的一些常见bug,这样,更好的调试兼容性,下面小强老师就把一些常见的ie6bug列出来,大家去研究下. 考虑结构的稳定性最常见的问题就是网页元素位置混乱,错位. 1.1.1.DOCTYPE 必须有 必需在开头处使用<!DOCTYPE>标记为所有的XHTML文档指定XHTML版本和类型,只有这样浏览器才能将该网页作为有效的XHTM

常见的bug

常见bug 一. Android系统功能测试设计的测试用例: a.对所测APP划分模块 b.详细列出每个模块的功能点(使用Xmind绘制功能图) c.使用等价类划分.边界值.场景法等对各功能点编写测试用例(考虑中断功能测试用例) d.执行测试之后,反思总结补充相关用例 二. 1)未按需求实现bug.... 2)开发实现时遗漏备选流...备选流bug; 3)性能问题,性能不过关(开发实现时不做性能保证) 4)数据错误: 5)修改A功能影响到B功能不能正常用: 6)数据存储错误: 7)多个操作结合在

IE6常见的bug及解决方法

1.IE6怪异解析之padding与border算入宽高 原因:未加文档声明造成非盒模型解析 解决方法:加入文档声明<!doctype html> 2.IE6在块元素.左右浮动.设定marin时造成margin双倍(双边距) 解决方法:display:inline 3.以下三种其实是同一种bug,其实也不算是个bug,举个例子:父标签高度20,子标签11,垂直居中,20-11=9,9要分给文字的上面与下面,怎么分?IE6就会与其它的不同,所以,尽量避免. 1)字体大小为奇数之边框高度少1px

1 duilib 自绘标题 最大化图标显示bug ----WindowImplBase的bug

窗口最大化之后有两个问题, 1.最大化按钮的样式还是没变,正确的样式应该是这样的 2.再次点击最大化按钮,不能还原到正常大小. 这个是WindowImplBase的bug,已经提交给官方有一段时间了,但是貌似没有被合并到SVN上去,所以这里说明一下, 我们需要在WindowImplBase的OnSysCommand函数里,在if( ::IsZoomed(*this) != bZoomed )里面加上下面这段代码: if( ::IsZoomed(*this) != bZoomed ) { CCon

你的bug,我的bug

说到使用python时要避免的问题,其实并不多,最近看到这样的微博:"有三种bug:你的bug,我的bug......还有线程."           python确实存在线程,但是要尽可能避免. 这与python 线程库没有任何关系,完全是因为python 的实现,特别是名为Cpython 的实现.python使用一种称为全局解释器锁的技术来实现.他强制实行这样一个限制,要求python 只能在一个解释器进程中运行,即使有多个处理器可用. 对于你来说,这意味着,如果你的程序使用了线程

Jmeter实现登录bugfree、新建bug、解决bug脚本(抓包工具实现)

环境 Chrome jmeter3.1 fiddler4 win7 32位 Linux CentOs6.4 bugfree3.0.1 链接:http://pan.baidu.com/s/1gfHpbpD 密码:wpxj  jmeter3.1软件包 链接:http://pan.baidu.com/s/1miHeNfa 密码:yqlp  fiddler4软件包 如果链接失效,可以自己网上寻找资源,或者加我百度云:天涯咫尺HK 一.打开jmeter.添加线程组.录制控制器.HTTPCookie管理器.

bug:inline-block间距bug的调整

<div id="one"> <a href="">首页</a> <a href="">首页</a> <a href="">首页</a> <a href="">首页</a> <a href="">首页</a> </div> *{ margin:0

CSS中常见的BUG调试

1.布局--layout 布局是windows提出的概念,用于控制元素的尺寸和定位. 拥有布局的元素负责自身及其子元素的尺寸及定位,而没有布局的元素仅仅能依靠近期的祖先元素进行控制. 通常在IE6中出现的BUG.非常可能是由于布局的缘故而产生的,因而修复IE中BUG的时候,第一件事就是尝试通过规则迫使元素拥有布局来看是否能修复. 默认情况下拥有布局的元素包含:body.html(标准模式下).table.tr.td.img.hr.input.select.textarea.button.ifra