Android異常處理最佳實(shí)踐
一個(gè)好的app 異常處理機(jī)制 我認(rèn)為應(yīng)該至少包含以下幾個(gè)功能:
1.能把錯(cuò)誤信息上傳到服務(wù)器 讓開發(fā)者可以持續(xù)改進(jìn)app
2.錯(cuò)誤信息至少應(yīng)該包含 是否在主進(jìn)程 是否在主線程 等可以幫助程序員定位的信息
3.最好包含手機(jī)硬件及軟件信息。
4.主進(jìn)程引發(fā)的異常 最好交由系統(tǒng)自己處理 也就是讓用戶可以感知到 那種(當(dāng)然你也可以自己定義一套更有意思的感知系統(tǒng)對話框等,具體可參考各種有意思的404界面)
5.子進(jìn)程引發(fā)的異常最好別讓用戶感知到。比如push之類的 這種 和用戶感知弱關(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è)地方 我們無法一定可以取得myLooper的值的 比如說 你的thread 沒有綁定消息循環(huán)
//那你的mylooper就返回的一定是null了,只有綁定了以后才會返回相應(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ù)器 便于開發(fā)者定位修改問題。
//如果是主進(jìn)程發(fā)生了異常 那還是交給系統(tǒng)自己默認(rèn)的異常處理來做。讓用戶感知到,否則用戶啥都不知道 體驗(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());
}
}
}
以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)Android軟件編程有所幫助。
相關(guān)文章
五分了解Android?Progress?Bar進(jìn)度條加載
這篇文章主要為大家介紹了Android?Progress?Bar進(jìn)度條加載的實(shí)現(xiàn)及屬性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Android如何給Textview添加菜單項(xiàng)詳解(Java)
TextView是android里面用的最多的控件,TextView類似一般UI中的Label,TextBlock等控件,只是為了單純的顯示一行或多行文本,下面這篇文章主要給大家介紹了關(guān)于Android如何給Textview添加菜單項(xiàng)的相關(guān)資料,需要的朋友可以參考下2022-01-01
Android 輕松實(shí)現(xiàn)圖片倒影效果實(shí)例代碼
這篇文章主要介紹了Android 輕松實(shí)現(xiàn)圖片倒影效果實(shí)例代碼,有需要的朋友可以參考一下2014-01-01
Android_UI 仿QQ側(cè)滑菜單效果的實(shí)現(xiàn)
相信大家對QQ側(cè)滑菜單的效果已經(jīng)不陌生了吧,側(cè)滑進(jìn)入個(gè)人頭像一側(cè),進(jìn)行對頭像的更改,我的收藏,QQ錢包,我的文件等一系列的操作,下面小編給大家分享Android_UI 仿QQ側(cè)滑菜單效果的實(shí)現(xiàn),一起看看吧2017-04-04
詳談android 6.0 fuse文件系統(tǒng)的掛載和卸載問題
今天小編就為大家分享一篇詳談android 6.0 fuse文件系統(tǒng)的掛載和卸載問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Android應(yīng)用第一次安裝成功點(diǎn)擊“打開”后Home鍵切出應(yīng)用后再點(diǎn)擊桌面圖標(biāo)返回導(dǎo)致應(yīng)用重啟問題的解決方法
這篇文章主要介紹了Android應(yīng)用第一次安裝成功點(diǎn)擊“打開”后Home鍵切出應(yīng)用后再點(diǎn)擊桌面圖標(biāo)返回導(dǎo)致應(yīng)用重啟問題的解決方法,需要的朋友可以參考下2016-11-11
EditText限制輸入數(shù)字,精確到小數(shù)點(diǎn)后1位的設(shè)置方法
下面小編就為大家?guī)硪黄狤ditText限制輸入數(shù)字,精確到小數(shù)點(diǎn)后1位的設(shè)置方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
Kotlin開發(fā)中open關(guān)鍵字與類名函數(shù)名和變量名的使用方法淺析
這篇文檔中,我們將解釋如何以及為什么將 open 關(guān)鍵字與類名、函數(shù)名和變量名一起使用,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的2023-02-02

