Android開(kāi)發(fā)中優(yōu)秀的app 異常處理機(jī)制
一個(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)文章
Android WebView無(wú)法彈出軟鍵盤(pán)的原因及解決辦法
這篇文章主要介紹了Android WebView無(wú)法彈出軟鍵盤(pán)的原因及解決辦法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Android中實(shí)現(xiàn)淘寶購(gòu)物車(chē)RecyclerView或LIstView的嵌套選擇的邏輯
這篇文章主要介紹了Android中實(shí)現(xiàn)淘寶購(gòu)物車(chē)RecyclerView或LIstView的嵌套選擇的邏輯,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12Android 簡(jiǎn)單的彈出框(在屏幕中間,傳string[],根據(jù)內(nèi)容框框大小自適應(yīng))
這篇文章主要介紹了Android 簡(jiǎn)單的彈出框(在屏幕中間,傳string[],根據(jù)內(nèi)容框框大小自適應(yīng)),需要的朋友可以參考下2017-04-04使用Compose制作抖音快手視頻進(jìn)度條Loading動(dòng)畫(huà)效果
這篇文章主要為大家介紹了使用Compose制作抖音快手視頻進(jìn)度條Loading動(dòng)畫(huà)效果,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08android使用Messenger綁定Service的多種實(shí)現(xiàn)方法
android使用Messenger綁定Service的多種實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-05-05Android開(kāi)發(fā)之Activity管理工具類(lèi)完整示例
這篇文章主要介紹了Android開(kāi)發(fā)之Activity管理工具類(lèi),集合完整實(shí)例形式分析了Android操作Activity創(chuàng)建、添加、獲取、移除等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01