Android异常处理最佳实践_安卓软件开发教程-查字典教程网
Android异常处理最佳实践
Android异常处理最佳实践
发布时间:2016-12-28 来源:查字典编辑
摘要:一个好的app异常处理机制我认为应该至少包含以下几个功能:1.能把错误信息上传到服务器让开发者可以持续改进app2.错误信息至少应该包含是否...

一个好的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软件编程有所帮助。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新安卓软件开发学习
    热门安卓软件开发学习
    编程开发子分类