ByteBuffer在某些Android版本上抛出UnsupportedOperationException

时间:2014-09-29 22:38:36

标签: android bytebuffer unsupportedoperation

我正在编写一些简单的网络代码,涉及使用ByteBuffers。出于某种原因,以下代码在我的两个测试设备上抛出UnsopportedOperationException:

int send = Integer.parseInt(edtxt.getText().toString());

OutputStream out = sock.getOutputStream();

ByteBuffer buf = ByteBuffer.allocateDirect(1);
buf.order(ByteOrder.BIG_ENDIAN);
    buf.put((byte)send);
    buf.rewind();
byte[] outa = buf.array(); //Exception thrown here
out.write(outa);

它失败的两个设备是:

  • 索尼爱立信Xperia Play运行Android 2.3.3

  • 运行Android 2.3.5的Motorla Droid X2

它的两个作用是:

  • LG G3运行Android 4.4.2

  • 运行Android 4.4.4的Nexus 4

文档说如果字节缓冲区不是基于数组,则抛出UnsupportedOperationException。姜饼和KitKat之间的区别是我需要处理的,还是只是一个不好的做法?

1 个答案:

答案 0 :(得分:0)

如果我在发布这个问题后不久就知道了,但是我会等待一个比我更好解释的人。因为没有人发布任何内容我只会自己做。

使上述代码适用于所有4个测试设备的关键是使用ByteBuffer.allocate而不是allocateDirect。我不确定为什么后者不能保证缓冲区的阵列支持。我确实找到了这个答案: https://stackoverflow.com/a/5671880/482085 482085

这给出了两种分配方法之间差异的一个很好的解释。显然,直接缓冲区映射到JVM外部的本机OS内存。如果我不得不猜测为什么这会导致我的Gingerbread设备没有阵列支持,那么它可能与我的KitKat设备的总体内存可用性显着降低的设备有关(尽管你可以在我的代码片段中看到,字节缓冲区根本不大)

我想你可以尝试两种方法,如果你真的想拥有一个直接缓冲区,并在直接分配失败时使用异常处理。

如果有人需要解决上述问题,这应该足够了。但是,对于潜在的问题,我仍然没有真正的答案。