1

나는 Androids 샘플 코드 블루투스 채팅으로 놀아왔다. 내 자신의 애플 리케이션을위한 기지로 사용에 대해 생각하고있어하지만 난 outofmemory 오류로 실행 계속. 바로 지금 나는 꽤 빠른 속도로 블루투스 장치에서 많은 양의 데이터를 읽도록 설정했다. 응용 프로그램은 String으로받는 바이트 배열을 변경하지만 잠시 후 outofmemory 오류가 발생합니다. gc가 생성하는 모든 String 객체를 제거하는 데 너무 느리다? 어떻게 문자열Android outofmemory 오류 할당

Bluetooth Chat

private final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
     case MESSAGE_STATE_CHANGE: 
      if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1); 
      switch (msg.arg1) { 
      case BluetoothChatService.STATE_CONNECTED: 
       setStatus(getString(R.string.title_connected_to, mConnectedDeviceName)); 
       mConversationArrayAdapter.clear(); 
       break; 
      case BluetoothChatService.STATE_CONNECTING: 
       setStatus(R.string.title_connecting); 
       break; 
      case BluetoothChatService.STATE_LISTEN: 
      case BluetoothChatService.STATE_NONE: 
       setStatus(R.string.title_not_connected); 
       break; 
      } 
      break; 
     case MESSAGE_WRITE: 
      byte[] writeBuf = (byte[]) msg.obj; 
      // construct a string from the buffer 
      String writeMessage = new String(writeBuf); 
      mConversationArrayAdapter.add("Me: " + writeMessage); 
      break; 
     case MESSAGE_READ: 
      byte[] readBuf = (byte[]) msg.obj; 
      // construct a string from the valid bytes in the buffer 
      String readMessage = new String(readBuf, 0, msg.arg1); 
      mConversationArrayAdapter.add(mConnectedDeviceName+": " + readMessage); 
      break; 
     case MESSAGE_DEVICE_NAME: 
      // save the connected device's name 
      mConnectedDeviceName = msg.getData().getString(DEVICE_NAME); 
      Toast.makeText(getApplicationContext(), "Connected to " 
          + mConnectedDeviceName, Toast.LENGTH_SHORT).show(); 
      break; 
     case MESSAGE_TOAST: 
      Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST), 
          Toast.LENGTH_SHORT).show(); 
      break; 
     } 
    } 
}; 

MESSAGE_READ 케이스의 메모리를 확보 할 것은 시간의 톤을 실행하는 것입니다. 또한 문자열을 16 진수 문자열로 변환합니다. 바이트 []를 귀중한 메모리를 절약 할 수있는 16 진수 문자열로 직접 변경하는 방법이 있습니까?

답변

0

메모리 부족 오류 : 저는 완벽한 솔루션이 아니지만 마지막으로 사용한 후에 변수를 무효로하면 GC가 프로세스 속도를 높일 수 있습니다.

byte []에 대해 hex의 문자열에 대해 바이트 배열을 반복하고 각 바이트에 Integer.toHexString(...)을 호출 할 수 있습니다.