Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android套接字-内存泄漏-传入消息_Java_Android_Performance_Sockets_Packet - Fatal编程技术网

Java Android套接字-内存泄漏-传入消息

Java Android套接字-内存泄漏-传入消息,java,android,performance,sockets,packet,Java,Android,Performance,Sockets,Packet,第一个问题,我希望你能帮助我:) 下面的代码是不久前编写的一些代码,用于侦听开放套接字上的传入数据包。代码运行良好,能够监听所有传入的消息,但是下面的函数似乎存在问题。这段代码似乎总是在运行,这导致它使用了大量的CPU电源和RAM。我无法显示更多的代码,因为代码太多了。只是想知道是否有更好的方式知道一个包已经到达。代码如下: ** { if(socket.getInputStream()!=null) { if(socket.getInputStream().available()>0) { i

第一个问题,我希望你能帮助我:)

下面的代码是不久前编写的一些代码,用于侦听开放套接字上的传入数据包。代码运行良好,能够监听所有传入的消息,但是下面的函数似乎存在问题。这段代码似乎总是在运行,这导致它使用了大量的CPU电源和RAM。我无法显示更多的代码,因为代码太多了。只是想知道是否有更好的方式知道一个包已经到达。代码如下:

**

{
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;
        }
    }