1

Я играл с Androids образца кода Bluetooth Чат. Я думаю об использовании его в качестве базы для своего собственного приложения, но я постоянно сталкиваюсь с ошибками outofmemory. В настоящий момент я настроил для чтения тонны данных с устройства bluetooth довольно быстро. Приложение изменяет массив байтов, который получает в 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 случаем является тот, который работает тонн раз. Также я преобразовываю String в Hex String. Есть ли способ изменить байт [] непосредственно на шестнадцатеричную строку, которая может сохранить драгоценную память?

ответ

0

об ошибках из памяти: у меня нет идеального решения, но сбрасывание переменной после последнего использования может помочь GC ускорить процесс.

О байте [] для строки гексов, вы можете попробовать выполнить итерацию по массиву байтов и вызвать Integer.toHexString(...) на каждый байт.