2012-07-30 62 views
0

我有一个程序调用函数requestAudioBlocks来请求一些数据。在它中,它初始化一个数组,然后调用一个数据请求。Java Array/ArrayList替换已添加数据的内部数据将被添加

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.sendRequest呼叫saveAudioBlocks,它发送一个可变下载要被放入数组。

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被调用两次,应该将两个ReadAudioData对象到阵列receivedAudioMessages

它的工作原理是第一次,作为正确ReadAudioData对象进入receivedAudioMessages [0]

ReadAudioData对象具有可变字符串,在这种情况下是“111”。如果你把一个破发点中saveAudioBlocks在该行receivedMessageCount ++,你可以看看在阵列中,它包含字符串变量“111”ReadAudioData对象,因为它应该在的位置。

然而,当saveAudioBlocks与新ReadAudioData对象再次呼吁,如果你在receivedAudioMessages看阵列在位置0时,ReadAudioData对象是包含在变量ReadAudioData对象下载传递给函数,其中包含一个字符串变量“122”。

这几乎就好像我正在保存一个指向数组中的变量下载的指针,而不是当前的实际对象。

我也尝试过使用ArrayLists,但同样的问题发生。

我在saveAudioBlocks一个破发点,以确保它不会被调用替换的数据时,我不知道,这是不是。

任何人都可以帮忙吗?

+0

检查saveAudioBlocks方法中receivedMessageCount的值,检查它是否再次设置为0? – Ankit 2012-07-30 09:19:22

+0

@Ankit在第一个通话中肯定是0,第二个是1。但奇怪的是,在receivedAudioMessages [receivedMessageCount] =下载之前,Array中的值已更改;线甚至是第二次! – 2012-07-30 09:23:49

+0

发布代码“你在哪里调用'saveAudioBlocks()'方法” – 2012-07-30 09:24:00

回答

2

这几乎就像我正在保存一个指向数组中的变量下载的指针,而不是当前的实际对象。

这就是发生了什么事。您将参考存储到参考的对象由本地变量download。所以如果该对象的属性发生变化,那么这个变化也会在你的数组中变得“可见”。

数组本身不存储对象,它们存储对对象的引用。

+0

哦对。那将是那个问题。你可以提出一种方法,我可以将两个不同的对象存储在一个数组中,而不必存储两次相同的对象? – 2012-07-30 09:26:33

+0

谢谢。我创建了两个不同的ReadAudioData对象。我正在使用之前刚被覆盖的同一个对象。 – 2012-07-30 10:00:24

1

这很可能是因为在您的呼叫代码中(您拨打saveAudioBlocks时,您将重复使用相同的ReadAudioData变量而不是创建一个新变量。

换句话说,如果你这样做:

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

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

两个receivedAudioMessages[0]receivedAudioMessages[1]包含相同的数据,它目前拥有的222的ID,您将获得与一个ArrayList相同的行为的参考。

这只是一个猜测,因为您尚未提供调用saveAudioBlocks方法的代码。

+0

它在调用代码中被覆盖,saveAudioBlocks函数肯定会同时发送正确的ReadAudioData对象。 – 2012-07-30 09:25:17

+0

@PippaRoseSmith我建议你编辑你的问题并发布调用saveAudioBlocks的代码。 – assylias 2012-07-30 09:30:44

+0

对不起,我应该包括它。我编辑了它,并包含代码@assylias – 2012-07-30 09:32:56