編輯:關於Android編程
一個好的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軟件編程有所幫助。
Android系統原本就為手機設計,所以,在android系統中的任何App中,只要願意,撥打指定電話非常方便。 核心就是使用Intent跳轉,指定請求Action為In
今天寫這篇文章的緣由是前一段時間一個網友在我的博客上面留言,想要實現在GridLayout(相當於九宮格)中點擊每項可左右滑動顯示該宮格的圖片,當該宮格的圖
本文介紹微信自動搶紅包的實現方法,主要實現以下幾個功能: 1.自動拆開屏幕上出現的紅包
簡介在使用百度地圖SDK為您提供的各種LBS能力之前,您需要獲取百度地圖移動版的開發密鑰,該密鑰與您的百度賬戶相關聯。因此,您必須先有百度帳戶,才能獲得開發密鑰。並且,該