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

(0)

相关推荐

  • Android崩溃异常捕获方法

    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面.而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里.但平时使用的时候给你闹崩溃,那你就欲哭无泪了. 那么今天主要讲一下如何去捕捉系统出现的Unchecked异常.何为Unchecked异常呢,换句话说就是指非受检异常,它不能用try-catch来显示捕捉. 我们先从Exception讲起.Exception分为两类:一种是CheckedException,一种是UncheckedException

  • 详解Android全局异常的捕获处理

    在Android开发中在所难免的会出现程序crash,俗称崩溃.用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug.这就会极大的影响用户体验,此时我们需要注册一个功能来捕获全局的异常信息,当程序出现crash信息,我们把错误log记录下来,上传到服务器,以便于我们能及时修复bug.实现这个功能我们需要依赖于UncaughtExceptionHandler这个类,UncaughtExceptionHandler是一个接口,在Th

  • Android开发使用UncaughtExceptionHandler捕获全局异常

    在集成了统计SDK(友盟统计,百度统计等)之后,有一个非常有利于测试的功能:错误分析!此功能能够将程序在运行中碰到的崩溃(runtimeException)问题反馈到服务器,帮助开发者改善产品,多适配机器. 然而在公司Android开发中不集成这些SDK,那应该怎么实现这样的功能呢?下面让我们来看下如何使用UncaughtExceptionHandler来捕获异常. 首先实现创建一个类,实现UncaughtExceptionHandler接口.代码如下: 复制代码 代码如下: public cl

  • AndroidStudio 使用过程中出现的异常(Gradle sync failed)处理办法

    AndroidStudio使用过程中出现的异常 异常信息: Gradle sync failed: Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. Please refer to the user guide chapter on th

  • Android实现捕获未知异常并提交给服务器的方法

    本文实例讲述了Android实现捕获未知异常并提交给服务器的方法.分享给大家供大家参考,具体如下: 在Android应用中,即便应用已经投放市场,但有时也会遇到一些未知的异常,此时如果能够获得用户的反馈信息,那么对于我们应用的开发是一个很好的帮助 为了实现这样的效果,我们需要做如下工作 写一个类实现UncaughtExceptionHandler接口,重写uncaughtException方法 功能描述:当应用出现了未知异常,应用强制退出,应用再次启动时,提示用户是否将错误信息反馈给开发者 pu

  • Android中捕获全局异常实现代码

    1.实现UncaughtExceptionHandler,在方法uncaughtException中处理没有捕获的异常. public class GlobalException implements UncaughtExceptionHandler { private final static GlobalException myCrashHandler = new GlobalException(); private GlobalException() { } public static s

  • Android ListView出现异常解决办法

    Android ListView 异常解决办法: ListView:The content of the adapter has changed but ListView did not receive a notification使用ListView时遇到如下的异常信息: 10-26 18:30:45.085: E/AndroidRuntime(7323): java.lang.IllegalStateException: The content of the adapter has chan

  • android 捕捉异常并上传至服务器的简单实现

    在项目中,我们的应用经常会遇到崩溃的情况,如果你的项目已经发送到了应用市场上,那么应用发生的崩溃开发人员是开不到的,所以我们要想办法将异常信息传到服务器上,便于开发人员查看并作出修改.Google考虑到这一点,也提供了Thread.UncaughtExceptionHandler接口来实现这一问题. 创建Crash异常捕获很简单,主要的步骤有: 1.创建BaseApplication继承Application并实现Thread.UncaughtExceptionHandler 2.通过Threa

  • 详解Android中处理崩溃异常

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开发者应该及时获取在该设备上导致崩溃的信息,这对于下一个版本的bug修复帮助极大,所以今天就来介绍一下如何在程序崩溃的情况下收集相关的设备参数信息和具体的异常信息,并发送这些信息到服务器供开发者分析和调试程序. 我们先建立一个crash项目,项目结构如图: 在MainActivity.ja

  • Android异常处理最佳实践

    一个好的app 异常处理机制 我认为应该至少包含以下几个功能: 1.能把错误信息上传到服务器  让开发者可以持续改进app 2.错误信息至少应该包含 是否在主进程 是否在主线程 等可以帮助程序员定位的信息 3.最好包含手机硬件及软件信息. 4.主进程引发的异常 最好交由系统自己处理 也就是让用户可以感知到 那种(当然你也可以自己定义一套更有意思的感知系统对话框等,具体可参考各种有意思的404界面) 5.子进程引发的异常最好别让用户感知到.比如push之类的 这种 和用户感知弱关联的这种.最好发生

  • Java编程异常处理最佳实践【推荐】

    Java中的异常处理不是一个简单的话题.初学者很难理解,甚至有经验的开发人员也会花几个小时来讨论应该如何抛出或处理这些异常.这就是为什么大多数开发团队都有自己的异常处理的规则和方法.如果你是一个团队的新手,你可能会惊讶于这些方法与你之前使用过的那些方法有多么不同.常见的异常类型: NullPointerException -空指针引用异常 ClassCastException-类型强制转换异常 lllegalArgumentException-传递非法参数异常 ArithmeticExcepti

  • 详解Java异常处理最佳实践及陷阱防范

    前言 不管在我们的工作还是生活中,总会出现各种"错误",各种突发的"异常".无论我们做了多少准备,多少测试,这些异常总会在某个时间点出现,如果处理不当或是不及时,往往还会导致其他新的问题出现.所以我们要时刻注意这些陷阱以及需要一套"最佳实践"来建立起一个完善的异常处理机制. 异常分类 首先,这里我画了一个异常分类的结构图. 在JDK中,Throwable是所有异常的父类,其下分为"Error"和"Exception&

  • Spring Boot统一异常处理最佳实践(拓展篇)

    前言 之前一篇文章介绍了基本的统一异常处理思路: Spring MVC/Boot 统一异常处理最佳实践. 上篇文章也有许多人提出了一些问题: 如何区分 Ajax 请求和普通页面请求, 以分别返回 JSON 错误信息和错误页面. 如何结合 HTTP 状态码进行统一异常处理. 今天这篇文章就主要来讲讲这些, 以及其他的一些拓展点. 区分请求方式 其实 Spring Boot 本身是内置了一个异常处理机制的, 会判断请求头的参数来区分要返回 JSON 数据还是错误页面. 源码为: org.spring

  • Go中的错误和异常处理最佳实践方法

    目录 错误 认识错误 自定义错误 实现原理 异常 认识异常 处理异常 异常处理原则 异常处理实践 错误 认识错误 在Go中,错误是一种表示程序错误状态.包含了在程序在运行时.编译时的状态信息.一般我们在编写Go代码中,都会碰到如下的处理方式. file, err := os.Create("test.txt") fmt.Println(file) if err != nil { fmt.Println(err) return } 我们使用os库创建一个名为test.txt的文件,该方法

  • 详解Spring MVC/Boot 统一异常处理最佳实践

    前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是一件棘手的事情, 对于很多人来说, 可能对异常处理有以下几个问题: 什么时候需要捕获(try-catch)异常, 什么时候需要抛出(throws)异常到上层. 在 dao 层捕获还是在 service 捕获, 还是在 controller 层捕获. 抛出异常后要怎么处理. 怎么返回给页面错误信息. 异常处理反例 既然谈到异常, 我们先来说一下异常处理的反例, 也是很多人容易犯的错误, 这里我们同时讲到前端处理和后端处理 : 捕获异常后

  • 详解Android单元测试最佳实践

    目的 充分的单元测试就是提高代码质量最有效的手段之一,而单元测试严重依赖代码的可测试性,本文主要通过一个简单的DEMO演示如何对Android原生应用进行单元测试,同时示例代码采用MVP模式以提高代码的可读性和可测试性 简介 在Android原生应用开发中,存在两种单元测试:本地JVM测试和Instrumentation测试.本文仅介绍本地JVM测试 本地jvm的单元测试 这种方式运行速度快,对运行环境没有特殊要求,可以很方便的做自动化测试,是单元测试首选的方法 Instrumentation测

  • Android 加载GIF图最佳实践方案

    起因 最近在项目中遇到需要在界面上显示一个本地的 GIF 图.按照惯例我直接用了 Glide 框架来实现. Glide 地址: https://github.com/bumptech/glide 我用的 Glide版本为 4.0.0-RC1 , 具体的实现代码如下: Glide.with( this ).asGif().load( R.drawable.yiba_location ).into( location_image ) ; 运行的效果很卡顿,我怀疑是不是方法没有用对,调了压缩模式,还是

  • 务必掌握的Android十六进制状态管理最佳实践

    目录 前言 我和十六进制的 “三次握手” 使用十六进制前的混沌世界 十六进制能很好解决这些问题 十六进制运作机制 十六进制状态管理实战 十六进制状态存取实战 小结 作为额外附赠的答疑 前言 上周在掘金巧遇一篇 “用设计模式管理状态” 文章,作为补充,在评论区安利我司封装商业级 SDK 时常用的 “十六进制状态管理机制”. 原以为无人对此感兴趣,没想到留言很快便收到文章作者回复,且在评论区耐心和我探讨设计模式 独占式状态机 和十六进制 复合状态管理 使用场景区别. 遗憾的是,通过评论区只言片语,难

  • jQuery最佳实践完整篇

    上周,我整理了<jQuery设计思想>. 那篇文章是一篇入门教程,从设计思想的角度,讲解"怎么使用jQuery".今天的文章则是更进一步,讲解"如何用好jQuery". 我主要参考了Addy Osmani的PPT<提高jQuery性能的诀窍>(jQuery Proven Performance Tips And Tricks).他是jQuery开发团队的成员,具有一定的权威性,提出的结论都有测试数据支持,非常有价值. ============

随机推荐