Java Android套接字-内存泄漏-传入消息
第一个问题,我希望你能帮助我:) 下面的代码是不久前编写的一些代码,用于侦听开放套接字上的传入数据包。代码运行良好,能够监听所有传入的消息,但是下面的函数似乎存在问题。这段代码似乎总是在运行,这导致它使用了大量的CPU电源和RAM。我无法显示更多的代码,因为代码太多了。只是想知道是否有更好的方式知道一个包已经到达。代码如下: **Java Android套接字-内存泄漏-传入消息,java,android,performance,sockets,packet,Java,Android,Performance,Sockets,Packet,第一个问题,我希望你能帮助我:) 下面的代码是不久前编写的一些代码,用于侦听开放套接字上的传入数据包。代码运行良好,能够监听所有传入的消息,但是下面的函数似乎存在问题。这段代码似乎总是在运行,这导致它使用了大量的CPU电源和RAM。我无法显示更多的代码,因为代码太多了。只是想知道是否有更好的方式知道一个包已经到达。代码如下: ** { if(socket.getInputStream()!=null) { if(socket.getInputStream().available()>0) { i
{
if(socket.getInputStream()!=null)
{
if(socket.getInputStream().available()>0)
{
int i=socket.getInputStream().available();
byte[]buffer=新字节[Global.c_iRxArraySize];
socket.getInputStream().read(缓冲区);
short[]converted=新short[Global.c_iRxArraySize];
对于(int j=0;j
如果Global.c_iRxArraySize的大小固定,您可以尝试重用缓冲区并进行转换,也可以尝试重用SimpleDataFormat,无需为每次调用创建和销毁该缓冲区,并且在此过程结束时可以重用和清理接收到的数据列表
在这个范围之外声明所有这些变量并重用,我认为这至少是第一步。如果N是缓冲区的大小,那么
InputStream
的read
方法不能保证您实际读取了N个字节。事实上,它返回了它已设法读取的字节数。这与您的que无关stion,但我认为您应该注意它。这里的更多信息:非常感谢,将进行一些更改,并且很可能会删除时间戳,我相信它是出于调试原因添加的,因此可以轻松删除。
{
if (socket.getInputStream() != null)
{
if (socket.getInputStream().available() > 0)
{
int i = socket.getInputStream().available();
byte[] buffer = new byte[Global.c_iRxArraySize];
socket.getInputStream().read(buffer);
short[] converted = new short[Global.c_iRxArraySize];
for (int j = 0; j < i; j++)
{
converted[j] = (short) (buffer[j] & 0xff);
}
Global.sNoTransmittionRecievedTimeout = 0;
p_DebugreceivedMessageSize = FindPacketSize(converted);
p_DebugreceivedMessageCount = p_DebugreceivedMessageCount + 1;
p_DebugreceivedMessageData = GetPacketContents(converted);
Date date = new Date();
SimpleDateFormat p_DebugreceivedMessageTime = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a");
DateReceivedData = p_DebugreceivedMessageTime.format(date);
List<String> DataListReceived = new ArrayList<String>();
DataListReceived.add(Arrays.toString(p_DebugreceivedMessageData));
MobileRxProtocol(converted);
Global.p_ReconnectionTimer = 0;
}
}