2012-01-05 1 views
3

J'ai une méthode pour enregistrer les récepteurs de diffusion à l'aide de filtres d'intention afin de découvrir les périphériques Bluetooth.Comment attendre la fin de Broadcast Receiver

// global variable 
String xpto = "empty"; 

Voici la méthode void:

IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); 

      BroadcastReceiver mReceiver = new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, Intent intent) { 

        App appState = ((App)getApplicationContext()); 
        appState.setTeste("OLAAAAA"); 

        String action = intent.getAction(); 

        elementos = new Vector<String>(); 

        String delimiter = "_"; 
        String[] temp = null; 

        xpto = "OLA"; 

        // When discovery finds a device 
        if (BluetoothDevice.ACTION_FOUND.equals(action)) { 
         // Get the BluetoothDevice object from the Intent 
         BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 


         // SO VAI VERIFICAR DO QUE ESTAO PRESENTES (DISCOVERABLE) OS QUE ESTAO PAIRED 
         if (device.getBondState() == BluetoothDevice.BOND_BONDED) { 
          Log.v("TAG","PAIRED AND PRESENT="+device.getName()); 
          temp = device.getName().split(delimiter); 
         } 

         int aux = 0; 

         if(temp != null) 
         { 
          for(int i =0; i < temp.length ; i++) 
          { 
           if(temp[aux].equals("SapoFit")) 
           { 
            elementos.add(temp[aux]+"_"+temp[aux+1]); 
            Log.v("TAG","Seleccionado="+temp[aux]+"_"+temp[aux+1]); 
           } 
           aux++; 
          } 

          elSelecionado = temp[0]+"_"+temp[0+1]; 

         } 

        } 

       } 
      }; 

      this.registerReceiver(mReceiver, filter); 

      Log.v("TAG","HERE COMES empty="+xpto.toString()); 

Mon problème est: parce que le code dans cette méthode est exécutée de manière séquentielle, le temps que j'essaie d'utiliser (dans cette méthode dans la séquence) certains variables globales que j'alloue dans Broadcast Receiver, elles sont toujours nul ou vides. J'ai cependant dans certaines "solutions" comme déplacer mon "code principal" d'un endroit à un récepteur de diffusion, ou avoir une autre variable globale alocatée à 1 quand BR est fini (et un temps x =! 1 dans le code principal attendre) mais ce n'est pas une bonne programmation, je suis sûr qu'il y a une bonne façon de le faire.

J'ai trouvé PendingResult mais le niveau API 11 est trop élevé pour moi. Aucune suggestion?

Répondre

1

S'il est utilisé par plusieurs composants et est vraiment "global" pour votre application, vous pouvez étendre l'objet Application et l'utiliser ici. Cela signifie qu'il sera alloué avant l'un de vos composants commence et il est accessible à tous vos composants. Il est également "sûr" et recommandé par de nombreuses personnes, car les variables "globales" sont en dehors du cycle de vie, tout comme l'objet Application. Tant que les deux composants ne lisent et n'écrivent pas au même instant, ça devrait aller. Si vous prévoyez un problème, vous pouvez également sécuriser le code en le synchronisant. Un mot d'avertissement sur l'extension de l'application.

Cela ne devrait pas être utilisé pour tout ce qui nécessite plusieurs objets pour y accéder. Cela ne devrait être utilisé que pour les données qui doivent rester en dehors du cycle de vie par nécessité.

S'il vous plaît laissez-moi savoir si vous avez besoin de clarification sur la façon d'étendre un Application et accéder aux nouvelles données.

Hope this helps, FuzzicalLogic

+0

Je mets ce code http://pastebin.com/mXG6iyW6 la classe App dans un autre fichier et ajouté cela dans le manifeste, mais je reçois toujours des valeurs nulles. Qu'est-ce que je ne comprends pas? – Tiago

+0

J'ai édité mon code pour que vous puissiez comprendre mon problème. – Tiago

+0

Je vais jeter un coup d'oeil. Null est juste une de ces choses que nous devons traiter. :) –

Questions connexes