ByteBuffer 在特定版本的 Android 上抛出 UnsupportedOperationException

Posted

技术标签:

【中文标题】ByteBuffer 在特定版本的 Android 上抛出 UnsupportedOperationException【英文标题】:ByteBuffer throws UnsupportedOperationException on certain version of Android 【发布时间】:2014-09-29 22:38:36 【问题描述】:

我正在编写一些涉及使用 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 之间的区别,还是只是一种不良做法?

【问题讨论】:

这不是一个不好的做法。不好的做法将是一种意见;这似乎是一个事实。 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于ByteBuffer 在特定版本的 Android 上抛出 UnsupportedOperationException的主要内容,如果未能解决你的问题,请参考以下文章

Android *** 服务 Bytebuffer 无法写入

ByteBuffer/IntBuffer/ShortBuffer Java 类快吗?

如何在android的MediaCodec上下文中使用ByteBuffer

Android 将数据从 ByteBuffer 存储到 Storage

来自 NIO Direct ByteBuffer 的 Android RenderScript 分配副本

Android jni 数据类型丢失精度(ByteBuffer,int)