Android异常处理最佳实践

 更新时间:2016年03月28日 16:38:26   作者:希尔瓦娜斯女神  
这篇文章主要为大家详细介绍了Android异常处理最佳实践,介绍了一个优秀的app异常处理机制包括什么,感兴趣的小伙伴们可以参考一下

一个好的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开发教程之handler异步更新ui

    android开发教程之handler异步更新ui

    这篇文章主要介绍了android使用handler异步更新ui的示例,大家参考使用吧
    2014-01-01
  • Android如何获取子View的位置及坐标详解

    Android如何获取子View的位置及坐标详解

    这篇文章主要给大家介绍了关于Android如何获取子View的位置及坐标的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Android自定义View实现时钟效果

    Android自定义View实现时钟效果

    这篇文章主要为大家详细介绍了Android自定义View实现时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Android自定义View实现绘制虚线的方法详解

    Android自定义View实现绘制虚线的方法详解

    这篇文章主要给大家介绍了Android自定义View实现绘制虚线的方法,在绘制过程中走了一些弯路才实现了虚线的效果,所以想着总结分享出来,方便有需要的朋友和自己在需要的时候参考学习,下面来一起看看吧。
    2017-04-04
  • 解决android有的手机拍照后上传图片被旋转的问题

    解决android有的手机拍照后上传图片被旋转的问题

    这篇文章主要介绍了解决android有的手机拍照后上传图片被旋转的问题的相关资料,需要的朋友可以参考下
    2016-09-09
  • Android可自定义神奇动效的卡片切换视图实例

    Android可自定义神奇动效的卡片切换视图实例

    今天小编就为大家分享一篇关于Android可自定义神奇动效的卡片切换视图实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Android编程之截屏实现方法(包括scrollview与listview)

    Android编程之截屏实现方法(包括scrollview与listview)

    这篇文章主要介绍了Android编程之截屏实现方法,包括截取scrollview与listview屏幕的相关技巧,以及截屏图片的生成与保存技巧,需要的朋友可以参考下
    2015-11-11
  • Kotlin学习教程之协程Coroutine

    Kotlin学习教程之协程Coroutine

    这篇文章主要给大家介绍了关于Kotlin学习教程之协程Coroutine的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • 基于Android本地代码生成器详解

    基于Android本地代码生成器详解

    本篇文章是对Android本地代码生成器的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Android实现双击返回键退出应用实现方法详解

    Android实现双击返回键退出应用实现方法详解

    这篇文章主要为大家详细介绍了Android实现双击返回键退出应用的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09

最新评论