Android 异常处理最佳实践
一个好的app 异常处理机制 我认为应该至少包含以下几个功能:
1.能把错误信息上传到服务器 让开发者可以持续改进app
2.错误信息至少应该包含 是否在主进程 是否在主线程 等可以帮助程序员定位的信息
3.最好包含手机硬件及软件信息。
4.主进程引发的异常 最好交由系统自己处理 也就是让用户可以感知到 那种(当然你也可以自己定义一套更有意思的感知系统对话框等,具体可参考各种有意思的404界面)
5.子进程引发的异常最好别让用户感知到。比如push之类的 这种 和用户感知弱关联的这种。最好发生异常就直接kill掉即可。不要再交给系统处理。
下面上代码。
package com.example.administrator.exceptiontest; import android.app.ActivityManager;
import android.app.Application;
import android.content.Context; /**
* Created by Administrator on 2015/12/9.
*/
public class BaseApplication extends Application { public static Context mContext;
//默认的异常处理
public static Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler; @Override
public void onCreate() {
super.onCreate();
mContext = this;
//先取得默认的异常处理handler
defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new BaseUncaughtExceptionHandler());
} }
package com.example.administrator.exceptiontest; import android.app.ActivityManager;
import android.content.Context;
import android.os.Looper; /**
* Created by Administrator on 2015/12/9.
*/
public class Utils { /**
* 判断是否在主线程中执行 如果是返回true 不是返回false
*/
public static boolean isInMainThread() {
//注意这个地方 我们无法一定可以取得myLooper的值的 比如说 你的thread 没有绑定消息循环
//那你的mylooper就返回的一定是null了,只有绑定了以后才会返回相应的值
return Looper.myLooper() == Looper.getMainLooper();
} //判断是否是主进程 如果是 就返回true 否则返回false
public static boolean isMainProcess(Context context)
{
return context.getPackageName().equals(getProcessName(context));
} //取得进程名
public static String getProcessName(Context context) {
String currentProcessName = "";
int pid = android.os.Process.myPid();
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
if (processInfo.pid == pid) {
currentProcessName = processInfo.processName;
break;
}
}
return currentProcessName;
} }
package com.example.administrator.exceptiontest; import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer; /**
* Created by Administrator on 2015/12/9.
*/
public class BaseUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { @Override
public void uncaughtException(Thread thread, Throwable ex) {
Writer resultWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(resultWriter);
ex.printStackTrace(printWriter);
StringBuffer sb = new StringBuffer();
sb.append("是否在主线程中发生异常" + Utils.isInMainThread() + "\n");
sb.append("是否在主进程中发生异常" + Utils.isMainProcess(BaseApplication.mContext) + "\n");
String errorReport = sb.toString() + resultWriter.toString();
//这个地方最好把收集到的错误信息日志 上传至服务器 便于开发者定位修改问题。
//如果是主进程发生了异常 那还是交给系统自己默认的异常处理来做。让用户感知到,否则用户啥都不知道 体验并不好
//你当然也可以自己定义特殊的错误提示 比如一些有意思的dialog什么的
if (Utils.isMainProcess(BaseApplication.mContext)) {
BaseApplication.defaultUncaughtExceptionHandler.uncaughtException(thread, ex);
} else {
//如果是子进程发生异常 不要给提示 直接殺掉子進程最好 別讓用戶感知到
android.os.Process.killProcess(android.os.Process.myPid());
}
} }
Android 异常处理最佳实践的更多相关文章
- Android开发最佳实践《IT蓝豹》
Android开发最佳实践 移动开发Android经验分享应用GoogleMaterial Design 摘要:前 段时间,Google公布了Android开发最佳实践的一系列课程,涉及到一些平时 ...
- Android开发最佳实践
Android开发最佳实践 摘要 ●使用 Gradle 和它推荐的工程结构 ●把密码和敏感数据放在gradle.properties ●不要自己写 HTTP 客户端,使用Volley或OkHttp库 ...
- Java异常处理最佳实践
总结一些Java异常的处理原则 Java异常处理最佳实践 不要忘记关闭资源 在finally里关闭资源 public void readFile() { FileInputStream fileInp ...
- [转]Android开发最佳实践
——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢—— 原文链接:https://github.com/futurice/and ...
- Java异常处理最佳实践及陷阱防范
前言 不管在我们的工作还是生活中,总会出现各种“错误”,各种突发的“异常”.无论我们做了多少准备,多少测试,这些异常总会在某个时间点出现,如果处理不当或是不及时,往往还会导致其他新的问题出现.所以我们 ...
- SpringBoot系列: Spring项目异常处理最佳实践
===================================自定义异常类===================================稍具规模的项目, 一般都要自定义一组异常类, 这 ...
- 转:使用Android API最佳实践
原文来自于:http://blog.jobbole.com/65170/ 写在前面 现在,Android应用程序中集成第三方API已十分流行.应用程序都有自己的网络操作和缓存处理机制,但是大部分比较脆 ...
- Android SharedPreference最佳实践
Android提供多种方式保存应用数据,其中一种方式是SharedPreferences,使用键值对保存私有基本的数据.所有的逻辑仅基于以下三个类: SharedPreferences SharedP ...
- Android 涂鸦最佳实践
Android中实现手势画图一般都两种方式,一是直接在View上绘制,而是使用SurfaceView. 两者还是有一些差别的.简介下. View:显示视图,内置画布,提供图形绘制函数.触屏事件.按键事 ...
随机推荐
- Windows 下 玩转Node.JS
vs一直是用的比较舒服的IDE,一直期望可以支持Node.JS.终于找到了一个工具 NTVS(Node.JS Tool For VS). 主页:https://nodejstools.codeplex ...
- 通过表达式、函数给React组件属性赋值
一.需求 当有传属性name的值时,则显示Hello "name",否则显示Hello World 二.4种方式的代码实现 1.通过三元运算符 <!DOCTYPE html& ...
- CreateProcess启动隐藏的外部程序(其实就是CreateDesktop,然后指定STARTUPINFO.lpDesktop)
HDESK hDesk = CreateDesktop(_T("MyDesk"), NULL, NULL, 0, GENERIC_ALL, NULL); ASSERT(hDesk) ...
- ActionResult
ActionResult public abstract class ActionResult { public abstract void ExecuteResult(ControllerConte ...
- 机器学习 —— 概率图模型(Homework: CRF Learning)
概率图模型的作业越往后变得越来越有趣了.当然,难度也是指数级别的上涨啊,以至于我用了两个周末才完成秋名山神秘车牌的寻找,啊不,CRF模型的训练. 条件随机场是一种强大的PGM,其可以对各种特征进行建模 ...
- rc.local自启动学习(转)
linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘. 本文中假设inittab中设置的init tree为: /etc/rc.d/rc0.d/etc/rc. ...
- js学习之道:表单验证公共js
/** 文件名称:CommonUtil.js 作者 : Yuce 编制时间: 2010-03-24 文件内容:一些常用的js公用类.工具类 包括方法: g_FormFieldIsNull 判断 ...
- C# 获取打印机状态
public static string GetPrinterStatus(string PrinterName) { int intValue = GetPrinterStatusInt ...
- 8.cadence.CIS[原创]
一.CIS数据库配置 ------ ---------------------------- --------------- ------------------ ---- 二.CIS放置元件 --- ...
- 转:java中scanner类的用法
声明:本文转自百度经验:http://jingyan.baidu.com/article/e73e26c0c74a1f24adb6a7fb.html Scanner是SDK1.5新增的一个类,可是使用 ...