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