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

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

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@427b7270 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);

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

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

    ie6下常见的bug 我们布局页面,首先符合标准,如何写一个页面的标准性? 但是ie6等浏览器本身就比较特殊,bug比较多,兵法云,知己知彼百战百胜.我们需要了解ie6的一些常见bug,这样,更好的调 ...

  2. 常见的bug

    常见bug 一. Android系统功能测试设计的测试用例: a.对所测APP划分模块 b.详细列出每个模块的功能点(使用Xmind绘制功能图) c.使用等价类划分.边界值.场景法等对各功能点编写测试 ...

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

    常见bug及其修复方法有以下几种 1.双外边距浮动bug 双外边距浮动bug在IE6及更低版本中常见.所谓双外边距浮动bug是指使任何浮动元素上的外边距加倍.(见下图) 只要将元素的display属性 ...

  4. pyppeteer使用时常见的bug及基本使用(转)

    pyppeteer使用时常见的bug及解决办法: https://blog.csdn.net/Mr__lqy/article/details/102626025 pyppeteer的基本使用: htt ...

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

    环境 Chrome jmeter3.1 fiddler4 win7 32位 Linux CentOs6.4 bugfree3.0.1 链接:http://pan.baidu.com/s/1gfHpbp ...

  6. bug生命周期&bug跟踪处理

    一.BUG BUG:软件的缺陷 1.BUG的定义:----与软件测试的目的对应 软件的BUG,狭义概念是指软件程序的漏洞或缺陷,广义概念除此之外还包括测试工程师或用户所发现和提出的软件可改进的细节.或 ...

  7. vue bug & data type bug

    vue bug & data type bug [Vue warn]: Invalid prop: type check failed for prop "value". ...

  8. 什么是需求Bug、设计Bug、功能bug?

    首先什么是需求Bug.设计Bug.功能bug? 需求Bug,指由于客户需求描述不清晰或错误.需求收集人员自身原因及需求本身模糊难于分析.获取等原因,导致客户需求获取不准确,后期产品不能满足客户.用户的 ...

  9. 如何区分前端BUG和后台BUG?

    测试工程师不只是负责发现问题,除了发现问题这种基本功外,定位问题,提出解决方案,提出预防方案也是要掌握的技能.这里先说定位问题的要求,定位问题要向深入,前提当然是对功能.产品的流程.开发方案.开发人员 ...

  10. android软件简约记账app开发day08-时间对话框的书写+改bug,改bug

    android软件简约记账app开发day08-时间对话框的书写+改bug,改bug 绘制对话跨页面 在添加记账信息功能中,我提供了用户添加备注添加事件的功能,设计是点击时间会弹出一个时间对话框供用户 ...

随机推荐

  1. Linux系统下远程文件拷贝scp命令

    在Linux系统下,不同机器上实现文件拷贝 一.将本地文件拷贝到远程机器: scp /home/administrator/news.txt root@192.168.6.129:/etc/squid ...

  2. ubuntu 14.04安装右键打开终端功能

    命令行运行,安装完成后需重启: sudo apt-get install nautilus-open-terminal

  3. Node.prototype.contains

    document.documentElement.contains(document.body) // true document.documentElement.compareDocumentPos ...

  4. 如何用github快速搭建个人博客

    当当当当-来看下新鲜出炉的Github博客 http://wli12.github.io/ 喜欢写markdown,但cnblogs对md文件的渲染简直丑爆了... 好奇怎么用github+Jekyl ...

  5. C#基础——winform应用上传图片到SQLServer数据库

    前言 之前通过winform与SQL Server的交互一直局限于文本.数字等信息,都可以通过string的方式来传输,但是比如音乐.图片等特殊格式的文件要如何与SQL Server数据库进行交互呢? ...

  6. Android之ListView&ViewPager模拟新闻界面

    模拟新闻 APP 的界面 1)写 ListView 之前先写布局: 这里有两种 Item 的布局: <?xml version="1.0" encoding="ut ...

  7. dede currentstyle属性完美解决方案

    问题一.dede让channelartlist标签支持currentstyle属性 完美解决 打开include\taglib\channelartlist.lib.php找到$pv->Fiel ...

  8. JSPatch心得

    转载请注明来源 1 CGSize,CGPoint,CGRect的使用,直接调用x,y,width,height四个属性,而且不用加().例子defineClass('PZPhotoView', { z ...

  9. 神奇的sort()函数

    今天来谈一谈sort()函数,sort() 方法用于对数组的元素进行排序,用法为arrayObject.sort(sortby):括号中的为可选参数,准确来说应该是一个函数,这个函数用来规定排序方法, ...

  10. React(JSX语法)-----JSX属性

    1. if you know all the propertities that you want to place on a component ahead of time,it is easy t ...