【问题标题】:Android outofmemory error allocationAndroid内存不足错误分配
【发布时间】:2012-02-28 03:30:31
【问题描述】:

我一直在玩弄 Android 示例代码蓝牙聊天。我正在考虑将它用作我自己的应用程序的基础,但我一直遇到内存不足的错误。现在我已经将它设置为以相当快的速度从蓝牙设备读取大量数据。该应用程序将它接收到的字节数组更改为一个字符串,但过了一会儿我得到了内存不足的错误。 gc 删除它创建的所有 String 对象是否太慢?如何释放字符串的内存

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 案例是运行无数次的案例。另外我正在将字符串转换为十六进制字符串。有没有办法把byte[]直接改成一个可以节省宝贵内存的十六进制字符串?

【问题讨论】:

    标签: android object garbage-collection bytearray out-of-memory


    【解决方案1】:

    关于内存不足错误:我没有完美的解决方案,但在最后一次使用后将变量无效可能有助于 GC 加快其进程。

    关于 byte[] 到十六进制字符串,您可以尝试遍历字节数组并在每个字节上调用 Integer.toHexString(...)。

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 2018-07-15
      • 2014-02-18
      • 2013-01-17
      • 2012-03-07
      • 1970-01-01
      • 2013-11-01
      相关资源
      最近更新 更多