Android異常處理最佳實務_Android

來源:互聯網
上載者:User

一個好的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軟體編程有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.