2012-02-28 73 views
1

我一直在玩Android的示例代码蓝牙聊天。我正在考虑将它用作我自己的应用程序的基础,但我一直遇到内存不足的错误。现在我已经设置了以相当快的速度从蓝牙设备读取大量数据。该应用程序将它收到的字节数组更改为一个字符串,但过了一段时间后,我得到了内存异常错误。删除创建的所有String对象时gc是否太慢?如何释放字符串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案件的内存是运行吨倍一体。此外,我将字符串转换为十六进制字符串。有没有办法将字节[]直接更改为可以节省宝贵内存的十六进制字符串?

回答

0

关于内存不足错误:我还没有完美的解决方案,但在最后一次使用后取消变量可能有助于GC加速其过程。

关于以不吉利的东西的字符串的byte [],您可以尝试遍历字节数组,每个字节调用Integer.toHexString(...)