zoukankan      html  css  js  c++  java
  • Android 异常处理最佳实践

    一个好的app 异常处理机制 我认为应该至少包含以下几个功能:

    1.能把错误信息上传到服务器  让开发者可以持续改进app

    2.错误信息至少应该包含 是否在主进程 是否在主线程 等可以帮助程序员定位的信息

    3.最好包含手机硬件及软件信息。

    4.主进程引发的异常 最好交由系统自己处理 也就是让用户可以感知到 那种(当然你也可以自己定义一套更有意思的感知系统对话框等,具体可参考各种有意思的404界面)

    5.子进程引发的异常最好别让用户感知到。比如push之类的 这种 和用户感知弱关联的这种。最好发生异常就直接kill掉即可。不要再交给系统处理。

    下面上代码。

     1 package com.example.administrator.exceptiontest;
     2 
     3 import android.app.ActivityManager;
     4 import android.app.Application;
     5 import android.content.Context;
     6 
     7 /**
     8  * Created by Administrator on 2015/12/9.
     9  */
    10 public class BaseApplication extends Application {
    11 
    12     public static Context mContext;
    13     //默认的异常处理
    14     public static Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler;
    15 
    16     @Override
    17     public void onCreate() {
    18         super.onCreate();
    19         mContext = this;
    20         //先取得默认的异常处理handler
    21         defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    22         Thread.setDefaultUncaughtExceptionHandler(new BaseUncaughtExceptionHandler());
    23     }
    24 
    25 
    26 }
     1 package com.example.administrator.exceptiontest;
     2 
     3 import android.app.ActivityManager;
     4 import android.content.Context;
     5 import android.os.Looper;
     6 
     7 /**
     8  * Created by Administrator on 2015/12/9.
     9  */
    10 public class Utils {
    11 
    12     /**
    13      * 判断是否在主线程中执行 如果是返回true 不是返回false
    14      */
    15     public static boolean isInMainThread() {
    16         //注意这个地方 我们无法一定可以取得myLooper的值的 比如说 你的thread 没有绑定消息循环
    17         //那你的mylooper就返回的一定是null了,只有绑定了以后才会返回相应的值
    18         return Looper.myLooper() == Looper.getMainLooper();
    19     }
    20 
    21 
    22     //判断是否是主进程 如果是 就返回true 否则返回false
    23     public static boolean isMainProcess(Context context)
    24     {
    25         return context.getPackageName().equals(getProcessName(context));
    26     }
    27 
    28     //取得进程名
    29     public static String getProcessName(Context context) {
    30         String currentProcessName = "";
    31         int pid = android.os.Process.myPid();
    32         ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    33         for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
    34             if (processInfo.pid == pid) {
    35                 currentProcessName = processInfo.processName;
    36                 break;
    37             }
    38         }
    39         return currentProcessName;
    40     }
    41 
    42 }
     1 package com.example.administrator.exceptiontest;
     2 
     3 import java.io.PrintWriter;
     4 import java.io.StringWriter;
     5 import java.io.Writer;
     6 
     7 /**
     8  * Created by Administrator on 2015/12/9.
     9  */
    10 public class BaseUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
    11 
    12     @Override
    13     public void uncaughtException(Thread thread, Throwable ex) {
    14         Writer resultWriter = new StringWriter();
    15         PrintWriter printWriter = new PrintWriter(resultWriter);
    16         ex.printStackTrace(printWriter);
    17         StringBuffer sb = new StringBuffer();
    18         sb.append("是否在主线程中发生异常" + Utils.isInMainThread() + "
    ");
    19         sb.append("是否在主进程中发生异常" + Utils.isMainProcess(BaseApplication.mContext) + "
    ");
    20         String errorReport = sb.toString() + resultWriter.toString();
    21         //这个地方最好把收集到的错误信息日志 上传至服务器 便于开发者定位修改问题。
    22         //如果是主进程发生了异常 那还是交给系统自己默认的异常处理来做。让用户感知到,否则用户啥都不知道 体验并不好
    23         //你当然也可以自己定义特殊的错误提示 比如一些有意思的dialog什么的
    24         if (Utils.isMainProcess(BaseApplication.mContext)) {
    25             BaseApplication.defaultUncaughtExceptionHandler.uncaughtException(thread, ex);
    26         } else {
    27             //如果是子进程发生异常 不要给提示 直接殺掉子進程最好 別讓用戶感知到
    28             android.os.Process.killProcess(android.os.Process.myPid());
    29         }
    30     }
    31 
    32 
    33 }
  • 相关阅读:
    添加gitignore文件后使其生效
    git提交时如何忽略一些文件
    苹果:Safari 4 下载量三天内达 1100 万次
    Linux Multitouch 技术展示
    HTML 5 来了,不需要 Flash 插件的 Youtube
    JSR 299(Java EE 平台的上下文与依赖注入)最终建议草案
    JSR 330(Java 的依赖注入)通过 JCP 接受
    HTML 5 来了,不需要 Flash 插件的 Youtube
    22 条经典的编程引言
    JSR 330(Java 的依赖注入)通过 JCP 接受
  • 原文地址:https://www.cnblogs.com/punkisnotdead/p/5034989.html
Copyright © 2011-2022 走看看