日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android ExceptionThrowable 常见异常和解决方法 奔溃日志上报 monkey异常修改

發布時間:2024/3/13 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android ExceptionThrowable 常见异常和解决方法 奔溃日志上报 monkey异常修改 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java將所有的錯誤封裝為一個對象,其根本父類為Throwable, Throwable有兩個子類:Error和Exception。

注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。
?

  • Error: 這種異常被設計成不被捕獲,因為這種異常產生于JVM自身。
  • Runtime Exception: 運行時異常往往與環境有關,編譯時無法檢查,并且可能發生的情況太廣泛,所以系統會去處理,程序不需要捕獲。
  • Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。程序中應當盡可能去處理這些異常。

    ? ? ? ?運行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。

    ? ????運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
    ? ? ? ?非運行時異常?(編譯異常):是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。




    問題:內存溢出不能捕獲的原因:

    首先,你得明白,內存溢出不是異常,是Error,Java中的異常分為受查異常和不受查異常。不受查異常時無法獲取之后用程序處理的。 OutOfMemory是不受查異常,它是由于java虛擬機運行時無法再分配到內存引起的,這時java虛擬機已經無法正常工作了,只能停止,所以就不能再捕獲

    二,異常的捕獲方法:

    try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
    catch 塊:用于處理try捕獲到的異常。
    finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。在以下4種特殊情況下,finally塊不會被執行:
    1)在finally語句塊中發生了異常。
    2)在前面的代碼中用了System.exit()退出程序。
    3)程序所在的線程死亡。
    4)關閉CPU。


    ?

    ?try、catch、finally語句塊的執行順序:

    1)當try沒有捕獲到異常時:try語句塊中的語句逐一被執行,程序將跳過catch語句塊,執行finally語句塊和其后的語句;

    2)當try捕獲到異常,catch語句塊里沒有處理此異常的情況:當try語句塊里的某條語句出現異常時,而沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句塊里的語句還是會被執行,但finally語句塊后的語句不會被執行;

    3)當try捕獲到異常,catch語句塊里有處理此異常的情況:在try語句塊中是按照順序來執行的,當執行到某一條語句出現異常時,程序將跳到catch語句塊,并與catch語句塊逐一匹配,找到與之對應的處理程序,其他的catch語句塊將不會被執行,而try語句塊中,出現異常之后的語句也不會被執行,catch語句塊執行完后,執行finally語句塊里的語句,最后執行finally語句塊后的語句;

    三,常見異常和處理方法

    runtimeException子類:

    1 .java.lang.NullPointerException2.?java.lang.IllegalArgumentException: n must be positive3.集合變化java.util.ConcurrentModificationException,Caused by: java.lang.ArrayIndexOutOfBoundsException4.動畫里面的算術java.lang.NumberFormatException: Invalid double: ""java.lang.ArithmeticException: divide by zero5.java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

    奇葩的問題:1.圖片。類,找不到,混淆問題:android.content.res.Resources$NotFoundException: File res/drawable-xhdpi-v4/abnormal_purple_beg.png from drawable resource ID #0x7f0200082.沒有方法,可能是API低版本的不支持,java.lang.NoSuchMethodError3.java.util.concurrent.TimeoutException:4.java.lang.SecurityException: Not allowed to start activity Intent 5.Caused by: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died6.java.lang.RuntimeException: Could not read input channel file descriptors from parcel.

    7.java.lang.reflect.InvocationTargetException

    IOException

    1.數據庫的IO異常 ??android.database.sqlite.SQLiteDiskIOException:
    2.文件沒有找到


    3.android.database.sqlite.SQLiteException: cannot commit - no transaction is activeat android.database.sqlite.SQLiteStatement.native_executeSql(Native Method)at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:93)at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1900)at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1839)at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:714)at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:276)at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:99)at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1741)at com.cx.module.data.apk.b$a.f(Unknown Source)at com.cx.module.data.apk.b$a.a(Unknown Source)at com.cx.module.data.apk.g.a(Unknown Source)at com.cx.module.data.center.b$1.run(Unknown Source)at java.lang.Thread.run(Thread.java:856)

    Error:
    Error:內存溢出:java.lang.OutOfMemoryError: Failed to allocate a 1868981625 byte allocation with 991781 free bytes and 509MB until OOM



    Android 中出現的
    1.有相同的ID
    ?java.lang.IllegalArgumentException:?Wrong?state?class,?expecting?View?State?but?received?class?android.widget.ProgressBar$SavedState?instead.?This?usually?happens?when?two?views?of?different?type?have?the?same?id?in?the?same?hierarchy.?This?view's?id?is?id/progressBar.?Make?sure?other?views?do?not?use?the?same?id. ?
    2.大致意思是說我使用的 commit方法是在Activity的onSaveInstanceState()之后調用的,這樣會出錯,因為

    ?onSaveInstanceState方法是在該Activity即將被銷毀前調用,來保存Activity數據的,如果在保存玩狀態后

    再給它添加Fragment就會出錯。解決辦法就是把commit()方法替換成 commitAllowingStateLoss()就行

    解決IllegalStateException: Can not perform this action after onSaveInstanceState

    3.Fragmentjava.lang.IllegalStateException: Fragment already added:

    4.???Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

    出現在Fragment或者是Adatper中!

    ?分析mInflater.inflate(R.layout.eg_refresh_message, this, false);

    5.清理 ??TidyShowActivity ?back建和onsaveinstance, 不調用父類的方法就可以

    5.listview中list和adapter不同步的問題6.?NetWorkOnMainThreadException ? ??不能在主線程聯網7.使用Fragment時遇到Binary

    XML file line #9: Error inflating class fragment

    解決方法:

    fragment加入的Activity 應該繼承于 FragmentActivity8.java.net.SocketException:Noroute原因:wifi未打開,無路由解決方法:wifi未打開,重新打開

    9. Can't create handler inside thread that has not called Looper.prepare()原因:不能在線程中操作主線程,比如在線程中創建dialog,更新UI等都是不可以的解決方法:在主線程中創建handler,通過handler.sendmessage()來更新UI,因為在主線程中創建的handler屬于主線程,起10.Android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application解決方案:將getApplication改成xxxx.this



    全局捕獲異常并上報:?比如第三方的友盟、蒲公英等,騰訊Bugly
    UncaughtExceptionHandler:在程序異常的時候,默認是把進程殺死,有們自己先上報然后手動再殺死進程!
    在Android開發中,常常會出現uncheched Exception 導致程序的crash,為了提供良好的用戶體驗,并對出錯的信息進行收集,以便對程序進行改進,提高程序的健壯性。?因此,常使用Thread.UncaughtExceptionHandler來進行處理。

    ?

    /** * 奔潰日志收集類 * @author rongweixin * @version 2017/2/15 11:26 * @email rongweixin@17renren.com */ public class CrashHandler implements Thread.UncaughtExceptionHandler {//系統默認的UncaughtException處理類private Thread.UncaughtExceptionHandler mDefaultHandler;//CrashHandler實例private static CrashHandler instance = new CrashHandler();//程序的Context對象private Context mContext;private static final String TAG=CrashHandler.class.getSimpleName();/** 崩潰應用包名KEY */ private final String KEY_PKG = "key_pkg";/** APP版本號KEY */ private final String KEY_VER = "key_ver";/** APP渠道號KEY */ private final String KEY_CXHZCHANNEL = "key_cxhzchannel";/** 廠商 */ private final String KEY_BRAND = "key_brand";/** 機型 */ private final String KEY_MODEL = "key_model";/** 系統版本KEY */ private final String KEY_OS_VER = "key_os_ver";/** 崩潰時間KEY */ private final String KEY_TIME = "key_time";//用來存儲設備信息和異常信息 系統崩潰日志private Map<String, String> infos;//用于格式化日期,作為日志文件名的一部分private DateFormat formatter;/** 保證只有一個CrashHandler實例 */ private CrashHandler() {infos = new HashMap<String, String>();formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.CHINA);}/** 獲取CrashHandler實例 ,單例模式 */ public static CrashHandler getInstance() {return instance;}/** * 初始化 * @param context */ public void init(final Context context) {mContext = context;//獲取系統默認的UncaughtException處理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();//設置該CrashHandler為程序的默認處理器Thread.setDefaultUncaughtExceptionHandler(this);new Thread(new Runnable() {@Overridepublic void run() {String pkg = CXPackageManagerUtil.getCurProcessName(context);for(int i=0;i<3;i++){if(pkg.contains(context.getPackageName())){try {Thread.sleep(1000);}catch (Exception e){e.printStackTrace();}pkg = CXPackageManagerUtil.getCurProcessName(context);}else{break;}}infos.put(KEY_PKG, pkg);if(pkg.contains(context.getPackageName())){infos.put(KEY_VER, String.valueOf(CXPackageManagerUtil.getPackageVersionCode(context)));infos.put(KEY_CXHZCHANNEL, CXPackageManagerUtil.getChannel(context));}else{infos.put(KEY_VER, String.valueOf(CXPackageManagerUtil.getVersionCode(mContext, mContext.getPackageName())));infos.put(KEY_CXHZCHANNEL, "");}infos.put(KEY_BRAND, Build.BRAND);infos.put(KEY_MODEL, Build.MODEL);infos.put(KEY_OS_VER, Build.VERSION.RELEASE);CXLog.i(TAG, infos.toString());}}).start();}/** * 初始化數據 * @param pkg */ public void init(String pkg){if(pkg != null){infos.put(KEY_PKG, pkg);infos.put(KEY_VER, String.valueOf(CXPackageManagerUtil.getVersionCode(mContext, mContext.getPackageName())));infos.put(KEY_CXHZCHANNEL, CXPackageManagerUtil.getChannel(mContext));infos.put(KEY_BRAND, Build.BRAND);infos.put(KEY_MODEL, Build.MODEL);infos.put(KEY_OS_VER, Build.VERSION.RELEASE);CXLog.i(TAG, infos.toString());}}/** * 自定義錯誤處理,收集錯誤信息 發送錯誤報告等操作均在此完成. * * @param ex * @return true:如果處理了該異常信息;否則返回false. */ private boolean handleException(Throwable ex) {boolean handled = false;if(ex != null){// 上傳奔潰日志postCrash(getCrashInfo(ex));// 保存奔潰日志CXLog.e(TAG, infos.toString());CXLog.e(TAG, getCrashInfo(ex)); // writeCrashInfo(ex);//使用Toast來顯示異常信息if(infos.get(KEY_PKG).equals(mContext.getPackageName())){new Thread() {@Overridepublic void run() {Looper.prepare();Toast.makeText(mContext, "程序發生異常,正在退出……", Toast.LENGTH_LONG).show();Looper.loop();}}.start();}handled = true;}return handled;}


    java將所有的錯誤封裝為一個對象,其根本父類為Throwable, Throwable有兩個子類:Error和Exception。

    注意:異常和錯誤的區別:異常能被程序本身可以處理,錯誤是無法處理。
    ?

  • Error: 這種異常被設計成不被捕獲,因為這種異常產生于JVM自身。
  • Runtime Exception: 運行時異常往往與環境有關,編譯時無法檢查,并且可能發生的情況太廣泛,所以系統會去處理,程序不需要捕獲。
  • Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。程序中應當盡可能去處理這些異常。

    ? ? ? ?運行時異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。

    ? ????運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
    ? ? ? ?非運行時異常?(編譯異常):是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。




    問題:內存溢出不能捕獲的原因:

    首先,你得明白,內存溢出不是異常,是Error,Java中的異常分為受查異常和不受查異常。不受查異常時無法獲取之后用程序處理的。 OutOfMemory是不受查異常,它是由于java虛擬機運行時無法再分配到內存引起的,這時java虛擬機已經無法正常工作了,只能停止,所以就不能再捕獲

    二,異常的捕獲方法:

    try 塊:用于捕獲異常。其后可接零個或多個catch塊,如果沒有catch塊,則必須跟一個finally塊。
    catch 塊:用于處理try捕獲到的異常。
    finally 塊:無論是否捕獲或處理異常,finally塊里的語句都會被執行。當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執行。在以下4種特殊情況下,finally塊不會被執行:
    1)在finally語句塊中發生了異常。
    2)在前面的代碼中用了System.exit()退出程序。
    3)程序所在的線程死亡。
    4)關閉CPU。


    ?

    ?try、catch、finally語句塊的執行順序:

    1)當try沒有捕獲到異常時:try語句塊中的語句逐一被執行,程序將跳過catch語句塊,執行finally語句塊和其后的語句;

    2)當try捕獲到異常,catch語句塊里沒有處理此異常的情況:當try語句塊里的某條語句出現異常時,而沒有處理此異常的catch語句塊時,此異常將會拋給JVM處理,finally語句塊里的語句還是會被執行,但finally語句塊后的語句不會被執行;

    3)當try捕獲到異常,catch語句塊里有處理此異常的情況:在try語句塊中是按照順序來執行的,當執行到某一條語句出現異常時,程序將跳到catch語句塊,并與catch語句塊逐一匹配,找到與之對應的處理程序,其他的catch語句塊將不會被執行,而try語句塊中,出現異常之后的語句也不會被執行,catch語句塊執行完后,執行finally語句塊里的語句,最后執行finally語句塊后的語句;

    三,常見異常和處理方法

    runtimeException子類:

    1 .java.lang.NullPointerException2.?java.lang.IllegalArgumentException: n must be positive3.集合變化java.util.ConcurrentModificationException,Caused by: java.lang.ArrayIndexOutOfBoundsException4.動畫里面的算術java.lang.NumberFormatException: Invalid double: ""java.lang.ArithmeticException: divide by zero5.java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState





    奇葩的問題:1.圖片。類,找不到,混淆問題:android.content.res.Resources$NotFoundException: File res/drawable-xhdpi-v4/abnormal_purple_beg.png from drawable resource ID #0x7f0200082.沒有方法,可能是API低版本的不支持,java.lang.NoSuchMethodError
    3.java.util.concurrent.TimeoutException:4.java.lang.SecurityException: Not allowed to start activity Intent 5.Caused by: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died6.java.lang.RuntimeException: Could not read input channel file descriptors from parcel.

    7.java.lang.reflect.InvocationTargetException

    IOException

    1.數據庫的IO異常 ??android.database.sqlite.SQLiteDiskIOException:
    2.文件沒有找到
    轉存失敗重新上傳取消

    3.android.database.sqlite.SQLiteException: cannot commit - no transaction is activeat android.database.sqlite.SQLiteStatement.native_executeSql(Native Method)at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:93)at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1900)at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1839)at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:714)at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:276)at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:99)at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1741)at com.cx.module.data.apk.b$a.f(Unknown Source)at com.cx.module.data.apk.b$a.a(Unknown Source)at com.cx.module.data.apk.g.a(Unknown Source)at com.cx.module.data.center.b$1.run(Unknown Source)at java.lang.Thread.run(Thread.java:856)

    Error:
    Error:內存溢出:java.lang.OutOfMemoryError: Failed to allocate a 1868981625 byte allocation with 991781 free bytes and 509MB until OOM



    Android 中出現的
    1.有相同的ID
    ?java.lang.IllegalArgumentException:?Wrong?state?class,?expecting?View?State?but?received?class?android.widget.ProgressBar$SavedState?instead.?This?usually?happens?when?two?views?of?different?type?have?the?same?id?in?the?same?hierarchy.?This?view's?id?is?id/progressBar.?Make?sure?other?views?do?not?use?the?same?id. ?
    2.大致意思是說我使用的 commit方法是在Activity的onSaveInstanceState()之后調用的,這樣會出錯,因為

    ?onSaveInstanceState方法是在該Activity即將被銷毀前調用,來保存Activity數據的,如果在保存玩狀態后

    再給它添加Fragment就會出錯。解決辦法就是把commit()方法替換成 commitAllowingStateLoss()就行

    解決IllegalStateException: Can not perform this action after onSaveInstanceState

    3.Fragmentjava.lang.IllegalStateException: Fragment already added:

    4.???Java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

    出現在Fragment或者是Adatper中!

    ?分析mInflater.inflate(R.layout.eg_refresh_message, this, false);

    5.清理 ??TidyShowActivity ?back建和onsaveinstance, 不調用父類的方法就可以

    5.listview中list和adapter不同步的問題6.?NetWorkOnMainThreadException ? ??不能在主線程聯網7.使用Fragment時遇到Binary

    XML file line #9: Error inflating class fragment

    解決方法:

    fragment加入的Activity 應該繼承于 FragmentActivity8.java.net.SocketException:Noroute原因:wifi未打開,無路由解決方法:wifi未打開,重新打開

    9. Can't create handler inside thread that has not called Looper.prepare()原因:不能在線程中操作主線程,比如在線程中創建dialog,更新UI等都是不可以的解決方法:在主線程中創建handler,通過handler.sendmessage()來更新UI,因為在主線程中創建的handler屬于主線程,起10.Android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application解決方案:將getApplication改成xxxx.this



    全局捕獲異常并上報:比如第三方的友盟、蒲公英等,騰訊Bugly
    UncaughtExceptionHandler:在程序異常的時候,默認是把進程殺死,有們自己先上報然后手動再殺死進程!
    在Android開發中,常常會出現uncheched Exception 導致程序的crash,為了提供良好的用戶體驗,并對出錯的信息進行收集,以便對程序進行改進,提高程序的健壯性。因此,常使用Thread.UncaughtExceptionHandler來進行處理。

    ?

    /*** 奔潰日志收集類* @author rongweixin* @version 2017/2/15 11:26* @email rongweixin@17renren.com*/ public class CrashHandler implements Thread.UncaughtExceptionHandler {//系統默認的UncaughtException處理類private Thread.UncaughtExceptionHandler mDefaultHandler;//CrashHandler實例private static CrashHandler instance = new CrashHandler();//程序的Context對象private Context mContext;private static final String TAG=CrashHandler.class.getSimpleName();/** 崩潰應用包名KEY */private final String KEY_PKG = "key_pkg";/** APP版本號KEY */private final String KEY_VER = "key_ver";/** APP渠道號KEY */private final String KEY_CXHZCHANNEL = "key_cxhzchannel";/** 廠商 */private final String KEY_BRAND = "key_brand";/** 機型 */private final String KEY_MODEL = "key_model";/** 系統版本KEY */private final String KEY_OS_VER = "key_os_ver";/** 崩潰時間KEY */private final String KEY_TIME = "key_time";//用來存儲設備信息和異常信息 系統崩潰日志private Map<String, String> infos;//用于格式化日期,作為日志文件名的一部分private DateFormat formatter;/** 保證只有一個CrashHandler實例 */private CrashHandler() {infos = new HashMap<String, String>();formatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.CHINA);}/** 獲取CrashHandler實例 ,單例模式 */public static CrashHandler getInstance() {return instance;}/*** 初始化* @param context*/public void init(final Context context) {mContext = context;//獲取系統默認的UncaughtException處理器mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();//設置該CrashHandler為程序的默認處理器Thread.setDefaultUncaughtExceptionHandler(this);new Thread(new Runnable() {@Overridepublic void run() {String pkg = CXPackageManagerUtil.getCurProcessName(context);for(int i=0;i<3;i++){if(pkg.contains(context.getPackageName())){try {Thread.sleep(1000);}catch (Exception e){e.printStackTrace();}pkg = CXPackageManagerUtil.getCurProcessName(context);}else{break;}}infos.put(KEY_PKG, pkg);if(pkg.contains(context.getPackageName())){infos.put(KEY_VER, String.valueOf(CXPackageManagerUtil.getPackageVersionCode(context)));infos.put(KEY_CXHZCHANNEL, CXPackageManagerUtil.getChannel(context));}else{infos.put(KEY_VER, String.valueOf(CXPackageManagerUtil.getVersionCode(mContext, mContext.getPackageName())));infos.put(KEY_CXHZCHANNEL, "");}infos.put(KEY_BRAND, Build.BRAND);infos.put(KEY_MODEL, Build.MODEL);infos.put(KEY_OS_VER, Build.VERSION.RELEASE);CXLog.i(TAG, infos.toString());}}).start();}/*** 初始化數據* @param pkg*/public void init(String pkg){if(pkg != null){infos.put(KEY_PKG, pkg);infos.put(KEY_VER, String.valueOf(CXPackageManagerUtil.getVersionCode(mContext, mContext.getPackageName())));infos.put(KEY_CXHZCHANNEL, CXPackageManagerUtil.getChannel(mContext));infos.put(KEY_BRAND, Build.BRAND);infos.put(KEY_MODEL, Build.MODEL);infos.put(KEY_OS_VER, Build.VERSION.RELEASE);CXLog.i(TAG, infos.toString());}}/*** 自定義錯誤處理,收集錯誤信息 發送錯誤報告等操作均在此完成.** @param ex* @return true:如果處理了該異常信息;否則返回false.*/private boolean handleException(Throwable ex) {boolean handled = false;if(ex != null){// 上傳奔潰日志postCrash(getCrashInfo(ex));// 保存奔潰日志CXLog.e(TAG, infos.toString());CXLog.e(TAG, getCrashInfo(ex)); // writeCrashInfo(ex);//使用Toast來顯示異常信息if(infos.get(KEY_PKG).equals(mContext.getPackageName())){new Thread() {@Overridepublic void run() {Looper.prepare();Toast.makeText(mContext, "程序發生異常,正在退出……", Toast.LENGTH_LONG).show();Looper.loop();}}.start();}handled = true;}return handled;}

    總結

    以上是生活随笔為你收集整理的Android ExceptionThrowable 常见异常和解决方法 奔溃日志上报 monkey异常修改的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。