2015-05-08 5 views
1

Я пытаюсь читать данные из последовательного потока Bluetooth В моем андроиде приложения. Данные отправляются обработчику для его отображения. Он отлично работает в течение нескольких минут, а затем прекращает показ данных (приложение продолжает работать). Я думаю, что это имеет отношение к утечкам памяти в моем обработчике, но я не знаю, как ее решить ..утечки памяти в обработчике Android

This is where I found the code

Я буду рад, если кто-то может мне помочь. Спасибо заранее

public class MainActivity extends ActionBarActivity { 

    static BluetoothAdapter mBluetoothAdapter = null; 
    static Handler mHandler = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //Does the device support bluetooth? 
     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     if (mBluetoothAdapter == null) { 
      Toast.makeText(this, "Device does not support Bluetooth",Toast.LENGTH_LONG).show(); 
     } 

     //Turn on Bluetooth if disabled 
     if (!mBluetoothAdapter.isEnabled()) { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, 1); 
     } 

     //Get the Bluetooth module device 
     BluetoothDevice mDevice = null; 
     Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); 
     if (pairedDevices.size() > 0) { 
      for (BluetoothDevice device : pairedDevices) { 
       if(device.getName().equals("HC-06")) { 
        mDevice = device; 
       } 
      } 
     } 
     if(mDevice == null){ 
      Toast.makeText(this,"Device not found",Toast.LENGTH_LONG).show(); 
     } 
     else{ 
      Toast.makeText(this,"connected to " + mDevice.getName(),Toast.LENGTH_LONG).show(); 

      ConnectThread mConnectThread = new ConnectThread(mDevice); 
      mConnectThread.start(); 

      mHandler = new Handler() { 
       @Override 
       public void handleMessage(Message msg) { 
        byte[] writeBuf = (byte[]) msg.obj; 
        int begin = (int)msg.arg1; 
        int end = (int)msg.arg2; 
        switch(msg.what) { 
         case 1: 
          String writeMessage = new String(writeBuf); 
          writeMessage = writeMessage.substring(begin, end); 

          ScrollView scrollView1 = (ScrollView) findViewById(R.id.scroll); 
          TextView textView1 = (TextView) findViewById(R.id.statusText); 
          textView1.append(writeMessage + "\n"); 
          scrollView1.fullScroll(View.FOCUS_DOWN); 

          break; 
        } 
       } 
      }; 
    } 
} 
+0

Вы можете разместить журналы? Чтобы определить, есть ли утечка памяти - посмотрите на свои журналы и отфильтруйте GC_, это будет число, которое будет увеличиваться и уменьшаться. Если число, которое следует за GC_, продолжает расти в ваших журналах - у вас есть утечка памяти, если она идет вверх/вниз, тогда нет утечки памяти, и ваша проблема лежит в другом месте! – Zain

+0

Все мои журналы выглядят следующим образом: несколько немногочисленные номера GC_FOR_ALLOC освобожден 824K, 25% бесплатно 5400K/7172K, приостановлено 4 мс, всего 4 мс –

+0

ОК, так что вы используете память 5.4k/7.7k - то, что вы хотите контролировать, - это 5.4 k продолжает расти, или это снижается (это происходит, когда происходит сбор мусора). Если время от времени происходит, ваша проблема не является утечкой памяти - можете ли вы разместить свои журналы сбоев, что может помочь диагностировать проблема? – Zain

ответ

1

Это не утечка памяти, в handleMessage() вы должны выполнять легкие операции, как установка текста TextView.

НО объявить scrollView1 и TextView 1 как глобальный Params, просто avoit операции findViewById каждый раз, это должно помочь.

Также вы передаете некоторые данные, но после генерации строки вы обрезаете ее, так что вам не нужны полные данные, не лучше ли это выполнить в CommnadThread и передать точно данные, что вам нужно показать.

+0

Я обнаружил, что он имеет какое-то отношение к буфере в подключенном потоке. Когда я наполовину сократить размер буфера приложение останавливается в два раза быстрее .. –

+0

@Max Helskens Извините, что значит, когда у вас есть размер буфера? Как я вижу в этом формате pdf всегда 1024. –

+0

Да, но когда я уменьшил его в коде, он остановился быстрее. Так что я думаю, что там что-то не так. –

0

Я нашел решение, это работает, когда я заменяю метод запуска в ConnectedThread с этим:

public void run() { 
     byte[] buffer = new byte[1024]; 
     int begin = 0; 
     int byteOffset = 0; 
     int byteCount; 
     while (true) { 
      try { 
       byteCount = buffer.length - byteOffset; 
       byteOffset += mmInStream.read(buffer, byteOffset, byteCount); 
       for(int i = begin; i < byteOffset; i++) { 
        if(buffer[i] == "#".getBytes()[0]) { 
         mHandler.obtainMessage(1, begin, i, buffer).sendToTarget(); 
         begin = i + 1; 
         if(i == byteOffset - 1) { 
          byteOffset = 0; 
          begin = 0; 
          break; 
         } 
        }      
       } 
       if(byteOffset == 1024){ 
        begin = 0; 
        byteOffset = 0; 
       }     
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
       break; 
      } 
     } 
    } 
Смежные вопросы