热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android开发中优秀的app异常处理机制

这篇文章主要介绍了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());
    }
  }

}


推荐阅读
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • Java中的基本数据类型与包装类解析
    本文探讨了Java编程语言中的8种基本数据类型及其对应的包装类。通过分析这些数据类型的特性和使用场景,以及自动拆装箱机制的实现原理,帮助开发者更好地理解和应用这些概念。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文深入探讨了 Exchange Server 2010 中客户端访问的代理和重定向机制,特别是在跨站点环境中如何配置这些功能以确保用户能够顺利访问邮箱服务。通过详细解析不同场景下的应用,帮助管理员更好地理解和实施相关设置。 ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • 本文详细介绍了如何正确配置Java环境变量PATH,以确保JDK安装完成后能够正常运行。文章不仅涵盖了基本的环境变量设置步骤,还提供了针对不同操作系统下的具体操作指南。 ... [详细]
  • PC时代的传奇人物
    回顾过去几十年,个人电脑(PC)的发展历程犹如一部英雄史诗。每一位杰出人物都在这一领域留下了不可磨灭的印记,他们的贡献不仅推动了技术的进步,也深刻影响了现代社会的发展。 ... [详细]
  • TortoiseSVN与VisualSVN Server的安装及基本操作指南
    本文详细介绍了如何安装VisualSVN Server以及TortoiseSVN客户端,并提供了基本的操作步骤,包括配置仓库、用户管理及权限设置等关键环节。 ... [详细]
  • 请看|间隔时间_Postgresql 主从复制 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • 本文详细介绍了get和set方法的作用及其在编程中的实现方式,同时探讨了点语法的使用场景。通过具体示例,解释了属性声明与合成存取方法的概念,并补充了相关操作的最佳实践。 ... [详细]
  • Shell脚本中变量操作详解
    本文基于《鸟哥的Linux私房菜》一书,详细介绍了Shell脚本中变量的使用方法,包括变量的赋值规则、字符串处理技巧以及环境变量的管理等,旨在帮助读者更好地理解和使用Shell中的变量。 ... [详细]
author-avatar
手机用户2502872795
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有