当前位置: 移动技术网 > 移动技术>移动开发>Android > Android异常处理最佳实践

Android异常处理最佳实践

2019年07月24日  | 移动技术网移动技术  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网