我是安卓新手。我似乎无法找到相关的论坛帖子。
让我感到困惑的是,它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 版本: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 管理器] hw.sdCard=no
[2012-12-20 10:09:34 - SDK 管理器] hw.device.manufacturer=Google
[2012-12-20 10:09:34 - SDK 管理器] hw.mainKeys=no
[2012-12-20 10:09:34 - SDK 管理器] hw.lcd.density=320
[2012-12-20 10:09:34 - SDK 管理器] hw.accelerometer=yes
[2012-12-20 10:09:34 - SDK 管理器] hw.dPad=no
[2012-12-20 10:09:34 - SDK 管理器] hw.device.hash=-708107041
[2012-12-20 10:09:34 - SDK 管理器] hw.trackBall=no
[2012-12-20 10:09:34 - SDK 管理器] hw.device.name=Galaxy Nexus
[2012-12-20 10:09:34 - SDK 管理器] hw.camera.back=none
[2012-12-20 10:09:34 - SDK 管理器] hw.sensors.proximity=yes
[2012-12-20 10:09:34 - SDK 管理器] hw.battery=yes
[2012-12-20 10:09:34 - SDK 管理器] disk.dataPartition.size=200M
[2012-12-20 10:09:34 - SDK 管理器] hw.audioInput=yes
[2012-12-20 10:09:34 - SDK 管理器] hw.sensors.orientation=yes
[2012-12-20 10:09:34 - SDK 管理器] hw.camera.front=none
[2012-12-20 10:09:34 - SDK 管理器] hw.gps=yes
[2012-12-20 10:09:34 - SDK 管理器] skin.dynamic=no
[2012-12-20 10:09:34 - SDK 管理器] hw.keyboard=yes
[2012-12-20 10:09:34 - SDK 管理器] vm.heapSize=64
[2012-12-20 10:09:34 - SDK 管理器] hw.ramSize=512