Android的蓝牙应用程序反应迟钝

问题描述:

我有通过异步任务 蓝牙设备,如果我收到一个电话,在通话过程中我回应用 屏幕变暗和应用程序没有响应 回通信的应用按钮不起作用...并没有显示ANR对话框 有什么想法?Android的蓝牙应用程序反应迟钝

这里是处理连接的代码:

@Override 
protected Object doInBackground(Object... params) { 
    //boolean protocolUpdated; 
    int read = 0;          // The amount of bytes read from the socket. 
    byte[] buff = new byte[MessageHandler.BUFFERSIZE]; // The data buffer. 
    byte[] tmpSend = null;        // Misc bytes arrays returned from ProtocolParser as answers to send after decoding calls. 
    in = null; 
    out = null; 

    try { 
     if (Float.parseFloat(version) > 2.2){ 
      Method m = dev.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
      sock = (BluetoothSocket) m.invoke(dev, 1); 
     } 

     else sock = dev.createRfcommSocketToServiceRecord(UUID_RFCOMM_GENERIC); // UUID is constant for serial BT devices. 
     sock.connect(); // connect to the BT device. This is rather heavy, may take 3 secs. 
     sendMessage(MESSAGE_CONNECTION_ESTABLISHED); 
     in = sock.getInputStream(); 
     out = sock.getOutputStream(); 

     timer = new Timer(); 
     startFinishTimer();   //initialize finish timer 

     while(read != -1) {  // read = -1 means EOF. 
      do {    // as long as there is anything to send in the send queue - send it. 
       tmpSend = parser.nextSend(); 
       if(tmpSend != null){ 
        String msg = parseMessage(tmpSend); 
        Log.d("Writing:",msg); 
        out.write(tmpSend); 
       } 
      } while(tmpSend != null); 
      read = in.read(buff);  // read. This is a blocking call, to break this, interrupt the thread. 
      timer.cancel();    
      startFinishTimer();   //read is a blocking call so timer should be restarted only after read bytes. 
      parser.parse(buff,read); // parse the read message using the logic in the ProtocolParser derived class. 
      tmpSend = parser.getPool(); // if pool ack is required - send it. 
      if (tmpSend != null){ 

       Log.d("Writing:",parseMessage(tmpSend)); 
       out.write(tmpSend); 

      } 
      if (read != 0){ 
       Log.d("Read:",parseMessage(buff)); 
       tmpSend = parser.getAnswer(); // if answer is required (based on message) - send it. 
       if(tmpSend != null){ 
        out.write(tmpSend); 
       } 
      } 
      else { 
       Exception e = new IOException(); 
       throw e; 
      } 
     } 
    }catch (IOException e){ 
     e.printStackTrace(); 
     Log.d("Connection: ", "Bluetooth Connection CRASHED!"); 
     sendMessage(MESSAGE_CONNECTION_LOST); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
    return null; 
} 

其实没有足够的上下文来找到你的问题。

确保您从主线程启动此任务在其他情况下PostExecute将附加到错误的线程,您可以得到一场比赛。

确保您不会向代码中的多个处理程序发送相同的消息。 消息这是一个链表,你可能会得到ANR在这种情况下。

获取/data/anr/traces.txt以确保它不是ANR。

您可以在文件的开头按时间进行确认。

+0

谢谢你的答复谢尔盖。我不确定你是否注意到,但这个问题在两年前接近问。不幸的是,这个项目在一段时间前完成了,告诉你实话,我甚至不记得最后有什么问题...... – zwebie 2013-11-06 16:22:10