Я играл с примером кода Androids Bluetooth Chat. Я думаю об использовании его в качестве базы для своего собственного приложения, но я постоянно сталкиваюсь с ошибками outofmemory. В настоящий момент я настроил для чтения тонны данных с устройства bluetooth довольно быстро. Приложение изменяет массив байтов, который получает в String, но через некоторое время я получаю ошибку outofmemory. Является ли gc слишком медленным при удалении всех объектов String, которые он создает? Как освободить память строки?
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 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. Есть ли способ изменить байт [] непосредственно на шестнадцатеричную строку, которая может сохранить драгоценную память?
об ошибках вне памяти: у меня нет идеального решения, но сведение значения переменной после последнего использования может помочь GC ускорить процесс.
О байте [] для строки гексов, вы можете попытаться выполнить итерацию по Integer.toHexString(...)
массиву и вызвать Integer.toHexString(...)
для каждого байта.