2017-09-22 3 views
0

J'ai besoin de mettre à jour un TextView en fonction des données que je reçois de la chaîne rfcomm bluetoothTextView pas mis à jour dans le gestionnaire RFCOMM

Ceci est la fonction de gestionnaire rfcomm:

// The Handler that gets information back from the BluetoothChatService 
private final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 

     txtViewDebug = (TextView) findViewById(R.id.txtView_textViewDebug); 
     switch (msg.what) { 
      case MESSAGE_STATE_CHANGE: 
       if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1); 
       switch (msg.arg1) { 
        case BluetoothChatService.STATE_CONNECTED: 
         // mTitle.setText(R.string.title_connected_to); 
         // mTitle.append(mConnectedDeviceName); 
         mConversationArrayAdapter.clear(); 
         break; 
        case BluetoothChatService.STATE_CONNECTING: 
         // mTitle.setText(R.string.title_connecting);   // ORIGINALLY PRESENT 
         break; 
        case BluetoothChatService.STATE_LISTEN: 
        case BluetoothChatService.STATE_NONE: 
         // mTitle.setText(R.string.title_not_connected);  // ORIGINALLY PRESENT 
         // mTitle.setText(R.string.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); 
       switch(rfcomm_state_flag){ 
        case 0: 
         mConversationArrayAdapter.add(mConnectedDeviceName+": " + readMessage); 
         break; 

        case 1: 
         // current received data is the lower half of the CSR audio signal 
         for(int i=0; i<AUDIO_FRAME_SIZE; i++){ 
          audio_sig_from_csr[i] = (short) readMessage.charAt(i); 
          // txtViewDebug.append(Integer.toHexString(audio_sig_from_csr[i] & 0xffff) + "\n") ; 
          // txtViewDebug.setText(txtViewDebug.getText() + Integer.toHexString(audio_sig_from_csr[i] & 0xffff) + "\n"); 
         } 
         txtViewDebug.append("Test value" + "\n") ; 
         // txtViewDebug.invalidate(); 

         break; 

        case 2: 
         // current received data is the upper half of the CSR audio signal 
         rfcomm_state_flag = 0;  // reset this flag to 0 
         for(int i=0; i<AUDIO_FRAME_SIZE; i++){ 
          tempVar = (short) readMessage.charAt(i); 
          audio_sig_from_csr[i] += (tempVar << 8); 
         } 

         try { 
          for(int i=0;i <audio_sig_from_csr.length; i++) 
           // savToDisk.writeShort(Short.reverseBytes(lin[i]));  // from wav file creator file 
           savToDisk.writeShort(audio_sig_from_csr[i]); 
          // payload += lin.length; // use this line if lin is an array of byte 
          // payload = payload + (lin.length)*2; 
          fd.sync(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         Toast.makeText(BluetoothChat.this, "File written", Toast.LENGTH_LONG).show(); 
         break; 
       } 

       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; 
     } 
    } 
}; 

Le projet lui-même basé sur le programme d'exemple Bluetooth Chat du site Web du développeur Android. J'ai modifié le programme de chat Bluetooth pour envoyer et recevoir des données RFCOMM à partir d'un périphérique Bluetooth personnalisé

case MESSAGE_READ: 

est l'endroit où les données RFCOMM entrants à partir du périphérique Bluetooth est reçu sous forme d'octets

Je change l'octet values-String et puis à short, que je veux afficher en tant que valeurs hexadécimales dans un TextView pour comparer si ce que je reçois du canal rfcomm est la même valeur que celle envoyée par le périphérique bluetooth

Ma tentative de mise à jour du TextView peut être vue sous case 1: dans case MESSAGE_READ:

Cependant, le TextView ne met pas à jour si j'appelle la fonction setText() de la fonction append().

La ligne

txtViewDebug = (TextView) findViewById(R.id.txtView_textViewDebug); 

était en onCreate(), mais cela ne fonctionne pas non plus.

J'ai essayé d'appeler invalidate() après avoir lu les here, mais cela ne fonctionne pas non plus

Pourquoi ne pas la mise à jour TextView à l'intérieur de cette fonction de gestionnaire? J'ai ajouté un autre bouton de commande à mon interface et ajouté un txtViewDebug.setText() simple et cela fonctionne comme prévu, mais je dois pouvoir le mettre à jour avec les valeurs que je reçois dans cette fonction de gestionnaire.

Pourquoi la mise à jour de TextView n'est-elle pas effectuée et comment résoudre ce problème?

Répondre

0

Réglage du texte doit être fait sur le fil ui essayez donc envelopper le code dans un runOnUiThread

+0

déjà essayé. Ça n'a pas marché. – user13267