0

ByteBuffers の操作を含む簡単なネットワーク コードを書いています。何らかの理由で、次のコードは 2 つのテスト デバイスで 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);

失敗する 2 つのデバイスは次のとおりです。

  • Android 2.3.3 を実行する Sony Ericsson Xperia Play

  • Android 2.3.5 を実行する Motorla Droid X2

動作するのは次の2つです。

  • Android 4.4.2 を実行する LG G3

  • Android 4.4.4 を実行する Nexus 4

ドキュメントによると、バイト バッファーが配列に基づいていない場合、UnsupportedOperationException がスローされます。これは、対処する必要がある Gingerbread と KitKat の違いですか、それとも単なる悪い習慣のケースですか?

4

1 に答える 1

0

この質問を投稿した直後に先日それを理解したとしても、私よりも優れた説明を持っている人を待つつもりでした。まだ誰も何も投稿していないので、自分でやります.

上記のコードを 4 つのテスト デバイスすべてで機能させるための鍵は、allocateDirect の代わりに ByteBuffer.allocate を使用することでした。ただし、後者がバッファの配列バッキングを保証しない理由は正確にはわかりません。私はこの答えを見つけました: https://stackoverflow.com/a/5671880/482085 482085

これは、2 つの割り当て方法の違いをよく説明しています。どうやら、ダイレクト バッファは JVM の外部のネイティブ OS メモリにマップされているようです。なぜこれが私の Gingerbread デバイスの配列バッキングにならなかったのかを推測しなければならなかった場合、それはデバイスが使用できる全体的なメモリが KitKat デバイスよりも大幅に少ないことに関係している可能性があります (ただし、私のコード スニペットでわかるように、バイトバッファはまったく大きくありません)

本当に直接バッファが必要な場合は両方を試して、直接割り当てが失敗した場合に例外処理を使用できると思います。

上記の問題の解決策が必要な場合は、これで十分です。ただし、根本的な問題に対する本当の答えはまだありません。

于 2014-09-30T13:08:24.723 に答える