0

関数requestAudioBlocksを呼び出してデータを要求するプログラムがあります。その中で、配列を初期化してから、データのリクエストを呼び出します。

private ReadAudioData[] receivedAudioMessages;

private int receivedMessageCount;

private boolean requestAudioBlocks(long blocksPerRequest)
{
    receivedAudioMessages = new ReadAudioData[2];

    receivedMessageCount = 0;

    connection.sendRequest();  //Send the command
}

connection.sendRequestが実行されると、connection.sendRequestsaveAudioBlocksを呼び出し、配列に配置される変数のダウンロードを送信します。

private ReadAudioData audioDataPacket;

public void sendRequest()
{
    ReadAudioData readAudioData;

    while (int count = 0; count < 2; count++)
    {
        readAudioData = new ReadAudioData();

        //Add the received information into the readAudioData variable

        audioDataPacket = readAudioData;

        saveAudioBlocks(audioDataPacket);
    }
}

新しいReadAudioDataオブジェクトが受信されるたびに、saveAudioBlocksが呼び出されます。

public void saveAudioBlocks(ReadAudioData download)
{
    receivedAudioMessages[receivedMessageCount] = download;

    receivedMessageCount++;
}

プログラムの実行中に、saveAudioBlocksが2回呼び出され、2つのReadAudioDataオブジェクトが配列receivedAudioMessagesに配置されます。

正しいReadAudioDataオブジェクトがreceivedAudioMessages[0]に入るので、これは最初に機能します。

ReadAudioDataオブジェクトには変数Stringがあり、この場合は111」です。ブレークポイントをsaveAudioBlocksのreceivedMessageCount++の行に配置すると、配列を調べることができ、位置0にあるはずの文字列変数「111」を持つReadAudioDataオブジェクトが含まれます。

ただし、saveAudioBlocksが新しいReadAudioDataオブジェクトで再度呼び出された場合、位置0のreceivedAudioMessages配列を見ると、 ReadAudioDataオブジェクトは、関数に渡された変数downloadに含まれる新しいReadAudioDataオブジェクトであり、文字列変数「122」が含まれています。

これは、変数downloadへのポインターを配列に保存しているようであり、現在の実際のオブジェクトではありません。

ArrayListsも使用しようとしましたが、同じ問題が発生します。

saveAudioBlocksにブレークポイントがあり、それが呼び出されていないことを確認して、気づいていないときにデータを置き換えています。

誰か助けてもらえますか?

4

2 に答える 2

2

これは、変数downloadへのポインターを配列に保存しているようであり、現在の実際のオブジェクトではありません。

これが起こることです。ローカル変数によって参照されるオブジェクトへの参照を格納します。したがって、そのオブジェクトのプロパティが変更されると、その変更は配列でも「表示」されます。download

配列はオブジェクト自体を格納するのではなく、オブジェクトへの参照を格納します。

于 2012-07-30T09:22:46.643 に答える
1

これは、呼び出し元のコード(呼び出し元では、新しい変数を作成する代わりにsaveAudioBlocks同じ変数を再利用する)が原因である可能性があります。ReadAudioData

言い換えれば、これを行う場合:

ReadAudioData data = new ReadAudioData();
data.setId("111");
receivedAudioMessages[0] = data;

data.setId("222");
receivedAudioMessages[1] = data;

両方receivedAudioMessages[0]receivedAudioMessages[1]同じデータへの参照が含まれており、IDは222になりました。ArrayListでも同じ動作が得られます。

saveAudioBlocksこれは、メソッドを呼び出すコードを提供していないため、推測にすぎません。

于 2012-07-30T09:19:56.303 に答える