0

我正在编写一些涉及使用 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);

它失败的两个设备是:

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

  • 运行 Android 2.3.5 的 Motorla Droid X2

它适用的两个是:

  • 运行 Android 4.4.2 的 LG G3

  • 运行 Android 4.4.4 的 Nexus 4

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

4

1 回答 1

0

如果在我发布此问题后不久就想通了,但要等待比我更好的解释的人。由于没有人发布任何内容,所以我会自己做。

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

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

我想如果你真的想要一个直接缓冲区,你可以尝试两者,并在直接分配失败的情况下使用异常处理。

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

于 2014-09-30T13:08:24.723 回答