我包括对我们应用程序的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
不会返回预期值,这可能是由于固件错误,或者是某些有经验的设备用户为调整其环境所做的事情。