我正在编写一些简单的网络代码,涉及使用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之间的区别是我需要处理的,还是只是一个不好的做法?
答案 0 :(得分:0)
如果我在发布这个问题后不久就知道了,但是我会等待一个比我更好解释的人。因为没有人发布任何内容我只会自己做。
使上述代码适用于所有4个测试设备的关键是使用ByteBuffer.allocate而不是allocateDirect。我不确定为什么后者不能保证缓冲区的阵列支持。我确实找到了这个答案: https://stackoverflow.com/a/5671880/482085 482085
这给出了两种分配方法之间差异的一个很好的解释。显然,直接缓冲区映射到JVM外部的本机OS内存。如果我不得不猜测为什么这会导致我的Gingerbread设备没有阵列支持,那么它可能与我的KitKat设备的总体内存可用性显着降低的设备有关(尽管你可以在我的代码片段中看到,字节缓冲区根本不大)
我想你可以尝试两种方法,如果你真的想拥有一个直接缓冲区,并在直接分配失败时使用异常处理。
如果有人需要解决上述问题,这应该足够了。但是,对于潜在的问题,我仍然没有真正的答案。