編輯:Android編程入門
閃退(Crash)是客戶端程序在運行時遭遇無法處理的異常或錯誤時而退出應用程序的表現,請從crash發生的原因分類與解決方法、在出現crash後如何捕捉並分析異常這兩個問題給出自己的解決方案。
我們以Android平台為例,介紹下如何捕獲Android應用的閃退信息,以幫助我們定位和解決導致閃退的問題代碼。
在講解Android中的閃退之前,我們先來簡單的復習下Java中的異常。
Java中的異常層次結構如下圖所示:
我們可以看到Throwable類是異常層級中的基類。Error類表示內部錯誤,這類錯誤使我們無法控制的;Exception表示異常,RuntimeException及其子類屬於未檢查異常,這類異常包括ArrayIndexOutOfBoundsException、NullPointerException等,我們應該通過條件判斷等語句避免未檢查異常的發生。IOException及其子類屬於已檢查異常,編譯器會檢查我們是否為所有可能拋出的已檢查異常提供了異常處理器,若沒有則會報錯。對於未檢查異常,我們無需捕獲(當然Java也允許我們捕獲,但我們應該做的事避免未檢查異常的發生)。
了解了這些我們大概可以知道,不論Android應用因為什麼原因閃退,我們只要能夠捕獲引起閃退的異常,那麼我們就可以進行異常處理。對於已檢查異常還好說,數量相對較少而且編譯器的強制下能夠保證我們為所有代碼中可能拋出的已檢查異常設置異常處理器。然而對於未檢查異常,我們難以預測代碼在一些極端情形下(比如劣質的SD卡、糟糕的網速)會觸發什麼樣的異常,因而很難捕獲所有可能的未檢查異常。好消息是Android為我們提供了獲取Android應用的閃退信息的機制,下面我們就來介紹一下。
運行的Android進程中存在一個UncaughtExceptionHandler對象(未捕獲異常處理器),我們可以通過Thread類的靜態方法setDefaultUncaughtExceptionHandler設置當前進程的UncaughtExceptionHandler對象。當出現一個未捕獲異常時,系統會調用出現異常的進程的UncaughtExceptionHandler對象的uncaughtException方法,也就是說在Android應用閃退前我們可以在這個方法中獲取引起閃退的異常信息。UncaughtExceptionHandler是一個接口,其中只定義了一個uncaughtException方法。
基於以上的分析我們知道了:只要將當前進程的未捕獲異常處理器設置為我們自定義的UncaughtExceptionHandler實例,我們就可以通過重寫UncaughtExceptionHandler方法來在閃退前獲取導致閃退的異常的詳細信息。下面的代碼中我們的自定義未捕獲異常處理器實現了UncaughtExceptionHandler接口:
public class CrashHandler implements UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e) { try { //傳入這個方法的參數e就是引起應用crash的異常,我們可以在這裡獲取異常信息,可以把異常信息上傳到服務器以便統一分析,也可以保存在文件系統中 } catch (Exception e) { ... } } }
設計好了自定義未捕獲異常處理器後,我們只需把它設置為當前進程的未捕獲異常處理器即可,相關代碼如下:
Thread.setDefaultUncaughtExceptionHandler(new CrashHandler());
關於Android應用的crash分析與處理,有很多成熟的第三方解決方案,比如Bugly、ACRA等,大家如果感興趣可以自行了解。
一個好的APP不僅有美觀,好看的界面,更需要良好的性能和穩定性。作為一名開發人員,需要理解界面設計原則並寫出優秀的界面設計代碼。本章主要講述基本控件的使用,界面布局及一些
這個月裝逼有點少了,為什麼呢,因為去考軟件射雞師了,快到兒童節了,趕緊寫篇博紀念一下逝去的青春,唔,請忽略這句話。 二維碼其實有很多種,但是我們常見的微信使用的
Android - 內容提供者(Content Provider)內容提供者組件通過請求從一個應用程序向其他的應用程序提供數據。這些請求由類 Conten
PS:寫一發關於Activity的生命周期,也算是面試的重點內容. 學習內容:1.Activity的生命周期2.面對多種情況的時候Activity的生命周期3.