应用崩溃的反馈
来源:互联网 发布:ubuntu主文件夹在哪 编辑:程序博客网 时间:2024/04/28 15:55
google目前也有个项目在处理这个问题http://code.google.com/p/acra/,不过那个包有点大,好几十k呢,如果我们想自我定制下,最重要的知识点就是
1.拦截UncaughtException
Application.onCreate()是整个Android应用的入口方法。在该方法中执行如下代码即可拦截UncaughtException:
ueHandler = new UEHandler(this);// 设置异常处理实例Thread.setDefaultUncaughtExceptionHandler(ueHandler);2.抓取导致程序崩溃的异常信息
UEHandler是Thread.UncaughtExceptionHandler的实现类,在其public void uncaughtException(Thread thread, Throwable ex)的实现中可以获取崩溃信息,代码如下:
package lab.sodino.uncaughtexception;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.PrintStream;import android.content.Intent;import android.util.Log;/** * @author Sodino E-mail:sodinoopen@hotmail.com * @version Time:2011-6-9 下午11:50:43 */public class UEHandler implements Thread.UncaughtExceptionHandler {private SoftApplication softApp;private File fileErrorLog;public UEHandler(SoftApplication app) {softApp = app;fileErrorLog = new File(SoftApplication.PATH_ERROR_LOG);}@Overridepublic void uncaughtException(Thread thread, Throwable ex) {// fetch Excpetion InfoString info = null;ByteArrayOutputStream baos = null;PrintStream printStream = null;try {baos = new ByteArrayOutputStream();printStream = new PrintStream(baos);ex.printStackTrace(printStream);byte[] data = baos.toByteArray();info = new String(data);data = null;} catch (Exception e) {e.printStackTrace();} finally {try {if (printStream != null) {printStream.close();}if (baos != null) {baos.close();}} catch (Exception e) {e.printStackTrace();}}// printlong threadId = thread.getId();Log.d("ANDROID_LAB", "Thread.getName()=" + thread.getName() + " id=" + threadId + " state=" + thread.getState());Log.d("ANDROID_LAB", "Error[" + info + "]");if (threadId != 1) {// 此处示例跳转到汇报异常界面。Intent intent = new Intent(softApp, ActErrorReport.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("error", info);intent.putExtra("by", "uehandler");softApp.startActivity(intent);} else {// 此处示例发生异常后,重新启动应用Intent intent = new Intent(softApp, ActOccurError.class);// 如果<span style="background-color: rgb(255, 255, 255); ">没有NEW_TASK标识且</span>是UI线程抛的异常则界面卡死直到ANRintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);softApp.startActivity(intent);// write 2 /data/data/<app_package>/files/error.logwrite2ErrorLog(fileErrorLog, info);// kill App Progressandroid.os.Process.killProcess(android.os.Process.myPid());}}private void write2ErrorLog(File file, String content) {FileOutputStream fos = null;try {if (file.exists()) {// 清空之前的记录file.delete();} else {file.getParentFile().mkdirs();}file.createNewFile();fos = new FileOutputStream(file);fos.write(content.getBytes());} catch (Exception e) {e.printStackTrace();} finally {try {if (fos != null) {fos.close();}} catch (Exception e) {e.printStackTrace();}}}}
另外UI主线程的thread id固定为1,莫非是每次因为他先启动的?
this.getBaseContext().getMainLooper().getThread().getId()上面取到的值确实是个1,即使在application的oncreate中先启动个thread,这个再研究下ActivityThread了
其他的内容参见http://blog.csdn.net/sodino/archive/2011/06/13/6540329.aspx
本文内容归CSDN博客博主Sodino 所有
转载请注明出处: http://blog.csdn.net/sodino/archive/2011/06/13/6540329.aspx- 应用崩溃的反馈
- 实时反馈的问答应用
- Android应用如何反馈Crash报告(即上传崩溃日志信息)
- 反馈、无反馈、不和谐的反馈
- 反馈式交互设计在网站里的实际应用
- android应用捕获运行异常发送反馈邮件的实现
- 获取iOS应用的崩溃日志
- 使用Multipletheme框架导致的应用崩溃
- app 被强杀后应用崩溃的解决思路
- Android应用崩溃的应急处理
- android 实现应用卸载反馈
- 电流反馈和电压反馈的判断
- Android应用 捕获应用崩溃的数据CrashHandler
- OpenGL的反馈
- OpenGL的反馈
- 放大电路的反馈
- 放大电路的反馈
- 反馈的判定方法
- 科技期刊综合业务管理系统的设计与实现
- 一个简单的窗口截取程序
- 基于svnserve的服务器,权限文件authz配置的常见问题及解答
- 欲速则不达
- SQL 左外连接、右外连接、全连接、内连接
- 应用崩溃的反馈
- Ext Js 3.x 的FormPanel学习与简单实例
- 通过javascript来打印web页面
- Windows下的SVN服务器和客户端配置
- 封装的一个用来下载图片的类
- mysql一些常用的操作命令
- oracle数据库开启和关闭
- 订单、支付、退款、发货、退货等编号自动生成类
- 2进制中的1个数