欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開(kāi)發(fā)中優(yōu)秀的app 異常處理機(jī)制

 更新時(shí)間:2015年12月10日 11:14:00   投稿:hebedich  
這篇文章主要介紹了Android開(kāi)發(fā)中優(yōu)秀的app 異常處理機(jī)制 的相關(guān)資料,需要的朋友可以參考下

一個(gè)好的app 異常處理機(jī)制 我認(rèn)為應(yīng)該至少包含以下幾個(gè)功能:

1.能把錯(cuò)誤信息上傳到服務(wù)器  讓開(kāi)發(fā)者可以持續(xù)改進(jìn)app

2.錯(cuò)誤信息至少應(yīng)該包含 是否在主進(jìn)程 是否在主線程 等可以幫助程序員定位的信息

3.最好包含手機(jī)硬件及軟件信息。

4.主進(jìn)程引發(fā)的異常 最好交由系統(tǒng)自己處理 也就是讓用戶可以感知到 那種(當(dāng)然你也可以自己定義一套更有意思的感知系統(tǒng)對(duì)話框等,具體可參考各種有意思的404界面)

5.子進(jìn)程引發(fā)的異常最好別讓用戶感知到。比如push之類(lèi)的 這種 和用戶感知弱關(guān)聯(lián)的這種。最好發(fā)生異常就直接kill掉即可。不要再交給系統(tǒng)處理。

下面上代碼。

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;
  //默認(rèn)的異常處理
  public static Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler;

  @Override
  public void onCreate() {
    super.onCreate();
    mContext = this;
    //先取得默認(rèn)的異常處理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 {

  /**
   * 判斷是否在主線程中執(zhí)行 如果是返回true 不是返回false
   */
  public static boolean isInMainThread() {
    //注意這個(gè)地方 我們無(wú)法一定可以取得myLooper的值的 比如說(shuō) 你的thread 沒(méi)有綁定消息循環(huán)
    //那你的mylooper就返回的一定是null了,只有綁定了以后才會(huì)返回相應(yīng)的值
    return Looper.myLooper() == Looper.getMainLooper();
  }


  //判斷是否是主進(jìn)程 如果是 就返回true 否則返回false
  public static boolean isMainProcess(Context context)
  {
    return context.getPackageName().equals(getProcessName(context));
  }

  //取得進(jìn)程名
  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("是否在主線程中發(fā)生異常" + Utils.isInMainThread() + "\n");
    sb.append("是否在主進(jìn)程中發(fā)生異常" + Utils.isMainProcess(BaseApplication.mContext) + "\n");
    String errorReport = sb.toString() + resultWriter.toString();
    //這個(gè)地方最好把收集到的錯(cuò)誤信息日志 上傳至服務(wù)器 便于開(kāi)發(fā)者定位修改問(wèn)題。
    //如果是主進(jìn)程發(fā)生了異常 那還是交給系統(tǒng)自己默認(rèn)的異常處理來(lái)做。讓用戶感知到,否則用戶啥都不知道 體驗(yàn)并不好
    //你當(dāng)然也可以自己定義特殊的錯(cuò)誤提示 比如一些有意思的dialog什么的
    if (Utils.isMainProcess(BaseApplication.mContext)) {
      BaseApplication.defaultUncaughtExceptionHandler.uncaughtException(thread, ex);
    } else {
      //如果是子進(jìn)程發(fā)生異常 不要給提示 直接殺掉子進(jìn)程最好 別讓用戶感知到
      android.os.Process.killProcess(android.os.Process.myPid());
    }
  }

}

相關(guān)文章

最新評(píng)論