2015-01-15 2 views
1

현재 로컬 네트워크를 통해 지속적으로 데이터를 보내는 스레드가 있습니다. 그러나로컬 네트워크를 통해 실시간 데이터 전송

@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(); 
     } 
    } 
} 

, 나는 항상 다음에 필요 결국 라우터 킥오프하는 시간의 기간을 위해 실행할 수있는 응용 프로그램 로그 캣에서 GC_FOR_ALLOC 메시지를 받고, 그리고 가능 해요 : 아래는 현재 코드의 조각이다 재설정하십시오. 네트워크를 통해 실시간 정보를 보내는 더 좋은 방법이 있습니까?

+1

예는'Service'를 사용하지만 여전히 와나 네트워크를 통해 실시간으로 데이터를 전송하는 경우 * 일정 * 당신은 나중에 안드로이드 OS를 재설정하기 위해 조만간 결정할 수 있습니다 무엇 이건 , 메모리가 필요한 경우 –

+0

@Sharpedge 빠른 답장을 보내 주셔서 감사합니다! 나는 확실히 서비스를 들여다 볼 것이다. – Raggeth

답변

1

GC_FOR_ALLOC가 할당 요청을 수행 할 수있는 충분한 여유 메모리가 아니었다 의미하므로 가비지 수집이 필요했다!

Logcat에있는 사람들의 많은 당신이 결국 중단 될 것입니다 일부 메모리 비용이 많이 드는 작업을하고있는 것을 의미한다. 응용 프로그램의 힙이 허용되는만큼 커지면 DVM이 OutOfMemoryException을 throw하고 응용 프로그램을 중지 한 후에 GC_FOR_ALLOC이 메모리를 해제 할 수 없습니다.

당신은 작업을 지연하는 Timer 사용을 고려하거나 UI Thread 일부 상호 작용이있는 경우 그 다음 작업에 충분한 메모리를 할당 할 DVM 충분한 시간을주고 않도록 handler.postDelayed(Runnable r, long delaymilisecs)을 사용해야합니다.

당신은 안드로이드에 메모리 소비를 관리하기위한 일반적인 전략에 대한 문서도있다 이러한 공식 링크

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

체크 아웃 앱의 RAM 사용 등 유출 된 객체를 조사 할 수 있습니다 :

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

관련 문제