2012-02-28 11 views
1

私はAndroidsサンプルコードBluetoothチャットで遊んできました。私は自分のアプリケーションのベースとして使用することを考えていますが、私はoutofmemoryエラーに走り続けます。今私はかなり高速な速度でBluetoothデバイスから大量のデータを読み込むように設定しています。アプリケーションは文字列に受け取るバイト配列を変更しますが、しばらくしてoutofmemoryエラーが発生します。 gcはそれが作成するすべてのStringオブジェクトを削除するには遅すぎますか?どのように私は文字列Android outofmemory error allocation

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場合は、時間のトンを実行するものです。また、私は、文字列を16進文字列に変換しています。貴重なメモリを節約できる16進文字列にバイト[]を直接変更する方法はありますか?

答えて

0

メモリ不足エラー:私は完璧な解決策ではありませんが、最後の使用後に変数を無効にすると、プロセスのスピードアップに役立ちます。

バイト[]についてヘックスの文字列に変換すると、バイト配列を繰り返し処理し、各バイトにInteger.toHexString(...)を呼び出すことができます。