2013-03-14 122 views
1

有沒有安全的方法來處理super.onCreate(savedInstanceState)引發的異常?如何處理super.onCreate中的異常?

我的用戶非常少數達不到這個錯誤

java.lang.NoClassDefFoundError - android.security.MessageDigest 

原因在this question討論,但基本上onCreate爲MapActivity類都可以拋出NoClassDefFoundError。我擔心事先檢測到這種情況可能不是未來的證明。

我認爲我的班級(它擴展了MapActivity)的最安全的解決方案是趕上NoClassDefFoundError並改爲啓動Google地圖的網址,例如,

try {    
     super.onCreate(savedInstanceState); 
    } catch (NoClassDefFoundError err) { 
     StringBuilder url = new StringBuilder(
       "http://maps.google.com/maps?q=").append(latitude) 
       .append(",").append(longitude).append("&z=18"); 

     Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url.toString())); 
     startActivity(i); 
     finish(); 
     return; 
    } 

不過,我擔心我的代碼將與SuperNotCalledExceptionNoClassDefFoundError發生崩潰。

有沒有一種安全的方式來處理super.onCreate調用中的異常/錯誤?

回答

0

MapActivity已被棄用,支持MapFragment,它是Google Play Services的一部分。我認爲這個新的API是向後兼容的。

我建議你事先檢測MapActivity。這將是未來的保證,因爲MapActivity API不會改變。 MapFragment API需要Google Play服務APK;該文檔向您顯示如何驗證它是否存在,如果不存在則提示用戶。該APK可從Google Play商店購買,並由OTA提供。

+0

「這個新API向後兼容,我認爲」 - 抱歉,但沒有。 – CommonsWare 2013-03-14 23:19:25

+0

我不認爲檢測MapActivity會有幫助 - 設備具有MapActivity類,但在實例化時會引發錯誤。我想我需要檢測已安裝的Google地圖應用的版本,並檢查它是否適用於此設備(例如,通過檢查相應的MessageDigest類)。 – 2013-03-14 23:45:44

3

我的用戶非常少數達不到這個錯誤

他們是運行谷歌地圖子系統的盜版用戶。 Google地圖在所有版本的Android上都能正常工作,並且許可證持有者將獲得正確的版本。然而,精神上受到挑戰的海盜有時會在較新的設備上使用舊版盜版地圖二進制文件,導致此問題。

但是,我擔心我的代碼會在發生NoClassDefFoundError時發生SuperNotCalledException異常。

有一個很好的機會,這的確會的情況下,或其他一些例外,如startActivity()可能因爲缺少super.onCreate()的崩潰。所以可能finish(),就此而言。不過,歡迎您嘗試。

有沒有一種安全的方式來處理super.onCreate調用中的異常/錯誤?

不一般。