我包括对我们应用程序的Android Beam支持。但是,因为我们仍然支持2.2 *咳嗽,咳嗽,姜饼,咳嗽*我已经将TargetCpi注释中的所有NFC代码包装在NfcHandler类中,以避免出现类似以下的皮棉警告:

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


然后在MainActivity期间从onCreate构建对象,如有必要,如下所示:

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        nfcHandler = new NfcHandler(this);


在构造函数中,它执行所有必要的NFC任务,然后在代码if( nfcHandler != null )中,我将意图传递给它,以便它可以检查它是否正在接收光束。

一切都很好,它在大多数时候都有效。
但是在极少数情况下,姜饼设备会崩溃:


  10-22 16:08:01.022 1734-1734 / com.baseapp.eyeem.p0 E / dalvikvm:找不到从方法com.foo.MainActivity.onCreate引用的类'com.baseapp.eyeem.os.NfcHandler'


我的意思是,该类确实存在,并且那里只是它的一个空对象。

因为我们在XXHDPI设备上的应用程序是23mb,在ldpi Gingerbread上是5mb,所以我可以看到即时编译器(JIT)或其他一些运行时优化正在删除不必要的资源。我想知道是否可能与我的NfcHandler类相同,因为它是对ICE_CREAM_SANDWICH的注释,因此会删除它。

所以问题是:


实际发生了什么?为什么我偶尔会而不是每次都发生此崩溃?

最佳答案

我的意思是,该类确实存在,并且那里只是它的一个空对象。


NfcAdapter.CreateNdefMessageCallback是在API级别14中添加的。因此,较旧的设备上的Dalvik无法成功加载它,因为它将无法解析该接口。

现在,原则上,如果上面显示的代码段是您引用的唯一位置,或者如果所有其他实例均具有相同的NfcHandler,则Dalvik原则上不应尝试在Gingerbread设备上加载您的if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)处理程序类。 Java版本保护块来保护它。

这表明在这些设备上,Build.VERSION.SDK_INT不会返回预期值,这可能是由于固件错误,或者是某些有经验的设备用户为调整其环境所做的事情。

08-03 14:09