Распределение ошибок Android вне памяти

1

Я играл с примером кода Androids Bluetooth Chat. Я думаю об использовании его в качестве базы для своего собственного приложения, но я постоянно сталкиваюсь с ошибками outofmemory. В настоящий момент я настроил для чтения тонны данных с устройства bluetooth довольно быстро. Приложение изменяет массив байтов, который получает в String, но через некоторое время я получаю ошибку outofmemory. Является ли gc слишком медленным при удалении всех объектов String, которые он создает? Как освободить память строки?

Bluetooth-чат

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. Есть ли способ изменить байт [] непосредственно на шестнадцатеричную строку, которая может сохранить драгоценную память?

Теги:
object
garbage-collection
out-of-memory
bytearray

1 ответ

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню