Android開發中優秀的app 異常處理機制

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

一個好的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開發使用UncaughtExceptionHandler捕獲全域性異常Android崩潰異常捕獲方法詳解Android全域性異常的捕獲處理Android中捕獲全域性異常實現程式碼android教程之hockeyapp捕獲異常示例android 捕獲系統異常並上傳日誌具體實現Android異常處理最佳實踐詳解Android中處理崩潰異常Android實現捕獲未知異常並提交給伺服器的方法

相關文章

Android 開發 最新文章