您的位置:首页 > 移动开发 > Android开发

Android闪退,而且日志报系统自身错误或者异常位置没问题,你解决了吗?

2017-04-14 11:09 519 查看
朋友问我android应用闪退,而且报错的地方正确,问我怎么办?

作为有经验的程序员了,首先,我断定这肯定是异常捕获不了导致的闪退。所以请看下面我帮你。

我说你让我看看报错日志吧。发现的确有报错异常,于是我看了他代码,发现报异常的代码附近并没有错。

于是我就问,你的日志是模拟器跑的还是真机测试的?这点很重要。

他告诉我说是真机测试的。我告诉他,你用模拟器跑一下吧,因为android系统被国内厂商修改后会有错误,作为资深程序员肯定不会让你知道他系统的错误,所以会屏蔽系统的一些日志。

然后他用模拟器跑完给我看了一下,发现报的日志的确不一样,是布局文件写错了。你遇到过吗?希望能帮助你。

如果还不能帮到你,那请看下面万能的办法:其实很简单

不论Android应用因为什么原因闪退,我们只要能够捕获引起闪退的异常,那么我们就可以进行异常处理。对于已检查异常还好说,数量相对较少而且编译器的强制下能够保证我们为所有代码中可能抛出的已检查异常设置异常处理器。然而对于未检查异常,我们难以预测代码在一些极端情形下(比如劣质的SD卡、糟糕的网速)会触发什么样的异常,因而很难捕获所有可能的未检查异常。好消息是Android为我们提供了获取Android应用的闪退信息的机制,下面我们就来介绍一下。

运行的Android进程中存在一个UncaughtExceptionHandler对象(未捕获异常处理器),我们可以通过Thread类的静态方法setDefaultUncaughtExceptionHandler设置当前进程的UncaughtExceptionHandler对象。当出现一个未捕获异常时,系统会调用出现异常的进程的UncaughtExceptionHandler对象的uncaughtException方法,也就是说在Android应用闪退前我们可以在这个方法中获取引起闪退的异常信息。UncaughtExceptionHandler是一个接口,其中只定义了一个uncaughtException方法。

只要将当前进程的未捕获异常处理器设置为我们自定义的UncaughtExceptionHandler实例,我们就可以通过重写UncaughtExceptionHandler方法来在闪退前获取导致闪退的异常的详细信息。下面的代码中我们的自定义未捕获异常处理器实现了UncaughtExceptionHandler接口:

public class CrashHandler implements UncaughtExceptionHandler {

@Override
public void uncaughtException(Thread t, Throwable e) {
try {
//传入这个方法的参数e就是引起应用crash的异常,我们可以在这里获取异常信息,可以把异常信息上传到服务器以便统一分析,也可以保存在文件系统中
} catch (Exception e) {
...
}
}
}


你只需在当前线程中调用:

Thread.setDefaultUncaughtExceptionHandler(new CrashHandler());
顺便总结一下android闪退的原因:

1、布局文件错误

2、控指针

3、存在系统捕获不了的异常信息

4、真机一般设置为不检查布局文件,所以一般闪退,布局文件居多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐