2013-10-22 36 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)'就足够了吗? –