我是android的新手。我似乎无法找到相关的论坛帖子。
让我感到困惑的是,allocateDirect()
确实在Android 4.2 模拟器中创建了支持字节[]。
更具体地说,我分配一个ByteBuffer,并多次调用buffer.put(byte[])
来编写ByteBuffer的内容。然后我想交出后备字节[]进行压缩。它正在访问抛出UnsupportedOperationException的后备字节[]。
这是运行Android 2.2模拟器后写入的结果缓冲区内容:
这是运行Android 4.2模拟器后写入后的结果缓冲区内容:
差异似乎在于是否创建了bufferRef.block
(它是在Android 4.2模拟器中分配ByteBuffer时创建的)。我宁愿总是使用直接的ByteBuffer。作为一种解决方法,我检查是否可以访问支持字节[],如果没有,则使用ByteBuffer.allocate(size)
重新分配。
ByteBuffer buf;
try {
buf = ByteBuffer.allocateDirect(this.maxBufferSize);
if(!buf.hasArray()) { //some API levels either don't expose or create the backing byte[]
buf = null;
buf = ByteBuffer.allocate(this.maxBufferSize);
}
} catch (Exception e) {
return false;
}
所以,我的问题是,有没有办法保证直接字节缓冲区总是有一个后备字节[](假设有足够的内存)?或者我必须忍受这种解决方法?
环境:
ADT Build:v21.0.0-519525
Android 2.2模拟器配置:
根据Android 2.2,ARM(armeabi)处理器更新了AVD'AVD_for_Galaxy_Nexus_by_Google', [2012-12-20 10:09:34 - SDK Manager],具有以下硬件配置:
[2012-12-20 10:09:34 - SDK Manager] hw.sdCard = no
[2012-12-20 10:09:34 - SDK Manager] hw.device.manufacturer = Google
[2012-12-20 10:09:34 - SDK Manager] hw.mainKeys = no
[2012-12-20 10:09:34 - SDK Manager] hw.lcd.density = 320
[2012-12-20 10:09:34 - SDK Manager] hw.accelerometer = yes
[2012-12-20 10:09:34 - SDK Manager] hw.dPad = no
[2012-12-20 10:09:34 - SDK Manager] hw.device.hash = -708107041
[2012-12-20 10:09:34 - SDK Manager] hw.trackBall = no
[2012-12-20 10:09:34 - SDK Manager] hw.device.name = Galaxy Nexus
[2012-12-20 10:09:34 - SDK Manager] hw.camera.back = none
[2012-12-20 10:09:34 - SDK Manager] hw.sensors.proximity = yes
[2012-12-20 10:09:34 - SDK Manager] hw.battery = yes
[2012-12-20 10:09:34 - SDK Manager] disk.dataPartition.size = 200M
[2012-12-20 10:09:34 - SDK Manager] hw.audioInput = yes
[2012-12-20 10:09:34 - SDK Manager] hw.sensors.orientation = yes
[2012-12-20 10:09:34 - SDK Manager] hw.camera.front = none
[2012-12-20 10:09:34 - SDK Manager] hw.gps = yes
[2012-12-20 10:09:34 - SDK Manager] skin.dynamic = no
[2012-12-20 10:09:34 - SDK Manager] hw.keyboard = yes
[2012-12-20 10:09:34 - SDK Manager] vm.heapSize = 64
[2012-12-20 10:09:34 - SDK Manager] hw.ramSize = 512
答案 0 :(得分:1)
更好的答案是.allocateDirect()
不会创建支持数组。您必须调用ByteBuffer.get(byte[])
来填充给定缓冲区中的数组。
答案 1 :(得分:0)
Android 2.2没有字节缓冲区。缓冲区是可选的。它是在以后的版本中实现的。