2013-10-22 76 views
1

我包括Android Beam支持我們的應用程序。但是,因爲我們仍然支持2.2 * 咳嗽模具升級Froyo,薑餅死亡,咳嗽 *我已經擠滿所有的NFC代碼的類NfcHandler與TargetApi註解,以避免lint警告這樣的:Android TargetApi註釋和即時編譯器

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
    public class NfcHandler implements NfcAdapter.CreateNdefMessageCallback 

然後在onCreateMainActivity我打造的對象,如果需要的是這樣的:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
     nfcHandler = new NfcHandler(this); 
在它所有必要的NFC的東西,在後面的代碼 if(nfcHandler != null)我的意圖傳遞給它的構造

,所以它可以檢查如果它收到g光束。

所有的優秀和偉大,它大多數時間工作。 但在很少的場合薑餅設備與崩潰:

10-22 16:08:01.022 1734年至1734年/ com.baseapp.eyeem.p0 E/dalvikvm:找不到類「com.baseapp.eyeem。 os.NfcHandler',引用方法com.foo.MainActivity.onCreate

我的意思是,類確實存在,它只是它的空對象。

由於我們在XXHDPI設備上的應用程序是23MB,並且在ldpi Gingerbread 5mb上,我可以看到即時編譯器(JIT)或其他運行時優化正在刪除不必要的資源。我想知道它是否可能與我的NfcHandler類相同,因爲它註釋爲ICE_CREAM_SANDWICH它會將其刪除。

所以,問題是:

  • 發生了什麼實際發生的情況和爲什麼我在一個同時獲得此崩潰只有一次,而不是每一次?

回答

3

我的意思是,該類確實存在,它只是它的空對象。

NfcAdapter.CreateNdefMessageCallback被添加到API Level 14中。因此,Dalvik無法在較舊的設備上成功加載它,因爲它無法解析該接口。

現在,原則上,Dalvik不應該嘗試在薑餅設備上加載您的NfcHandler處理程序類,如果上面顯示的代碼片段是唯一引用它的地方,或者所有其他事件都具有相同的if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) Java版本守衛阻止它。

它暗示的是,在這些設備上,Build.VERSION.SDK_INT沒有返回預期值,這可能是因爲固件錯誤,或者可能是某些根植設備用戶調整其環境的操作。

+0

引用它的其他代碼只是處理活動意圖的方法中的一個if(nfcHandler!= null && nfcHandler.handleIntent(intent))return;有問題的設備是我們的一款暱稱爲「shitty device」的測試設備,它是2.3.5版的HTC Wildfire S。我會嘗試在內部對象中打包'NfcAdapter.CreateNdefMessageCallback',並回報 – Budius

+0

,好像它已經做到了。由於該對象正在實現一個接口,因此JVM不知道它一直在抱怨並偶爾崩潰。 Thnks! – Budius

+0

@Budius:用'if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.ICE_CREAM_SANDWICH)'來保護'nfcHandler.handleIntent(intent)'就足夠了嗎? –