Android异常处理最佳实践
作者:希尔瓦娜斯女神 时间:2021-06-15 20:17:12
一个好的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,异常处理
0
投稿
猜你喜欢
Git设置和取消代理的方法
2021-06-25 21:47:10
java多线程之CyclicBarrier的使用方法
2023-11-04 21:52:54
Java多线程通信:交替打印ABAB实例
2022-04-08 06:57:28
C#子类对基类方法的继承、重写与隐藏详解
2023-01-31 04:48:46
实例讲解Android应用开发中TabHost的使用要点
2023-11-05 06:52:14
Android Shader应用开发之霓虹闪烁文字效果
2022-09-11 16:43:20
Kotlin中的密封类和密封接口及其应用场景
2021-07-01 17:46:11
Android使用WebView.loadUri()打开网页的方法
2022-07-18 06:17:18
一文详解如何在控制台显示MyBatis的SQL语句
2023-01-09 06:43:38
Android中XUtils3框架使用方法详解(一)
2021-07-09 08:24:21
timespan使用方法详解
2022-01-19 07:04:50
http请求绕过Filter的实现实例
2021-06-20 17:17:34
在Spring使用iBatis及配置讲解
2021-07-06 20:07:39
一篇文章带你了解java接口与继承
2022-07-15 02:44:08
Java Lambda表达式实例解析原理
2022-11-02 08:11:02
Java实现在线五子棋对战游戏(人机对战)
2023-01-10 19:07:29
Spring interceptor拦截器配置及用法解析
2023-06-26 06:08:15
Unity Shader片段着色器使用基础详解
2022-09-29 10:08:28
解决idea爆红 cant resolve symbol String的问题解析
2023-10-11 10:47:30
Spring JPA find单表查询方法示例详解
2022-11-03 19:43:38