通过本地网络传输实时数据

时间:2015-01-15 11:52:29

标签: java android memory-management

目前,我有一个不断通过本地网络发送数据的线程。以下是当前代码的片段:

@Override
public void run() {
    while(!interrupted()) {
        byte[] data = new byte[16];
        int b = 0;
        try {
            intToByteArray(acx[0][0], data, 0);
            intToByteArray(acx[0][1], data, 4);
            intToByteArray(acx[1][0], data, 8);
            for(int i = 0; i < btns.length; i++) {
                if(btns[i] == 1)
                    b |= (int) Math.pow(2, i);
            }
            intToByteArray(b, data, 12);
            //sleep(1000);
            socket.send(new DatagramPacket(data, data.length, InetAddress.getByName(local), port));
        } catch(InterruptedException e) {
            e.printStackTrace();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

但是,我经常在logcat中收到GC_FOR_ALLOC个消息,并且允许应用程序运行一段时间最终将关闭路由器,然后需要重置。是否有更好的方式通过网络发送实时信息?

1 个答案:

答案 0 :(得分:1)

GC_FOR_ALLOC表示没有足够的可用内存来完成分配请求,因此垃圾收集是必要的!

Logcat中的很多人意味着你正在做一些内存昂贵的操作,最终会停止。当应用程序的堆增长到允许的大小时,GC_FOR_ALLOC将无法释放任何内存,之后DVM抛出OutOfMemoryException并暂停应用程序。

您应该考虑使用Timer来延迟操作,或者如果您与UI Thread进行了某些互动,那么请使用handler.postDelayed(Runnable r, long delaymilisecs)以便DVM有足够的时间来为下一次操作分配足够的内存。

您可以调查应用程序的RAM使用情况和其他泄露的对象,查看这些官方链接

https://developer.android.com/tools/debugging/debugging-memory.html

还有一份关于在Android中管理内存消耗的一般策略的文档:

http://developer.android.com/training/articles/memory.html