2012-01-05 2 views
3

블루투스 장치를 발견하기 위해 의도 필터를 사용하여 브로드 캐스트 수신기를 등록하는 방법이 있습니다.브로드 캐스트 수신기가 끝날 때까지 기다리는 방법

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()); 

내 문제는 다음과 같습니다 : 메소드의 코드가 내가 (순서대로 그 방법) 사용하려고 시간에 의해 순차적으로 몇 가지를 실행하기 때문에 여기에

// global variable 
String xpto = "empty"; 

은 무효 방법입니다 브로드 캐스트 수신기에 할당 한 전역 변수는 여전히 null이거나 비어 있습니다.

"메인 코드"를 장소에서 브로드 캐스트 리시버로 이동하거나 BR이 완료되면 다른 글로벌 변수를 1로 할당하는 것과 같은 몇 가지 "해결책"이 있습니다 (메인 코드에서 x = 1! 기다릴)하지만 이것은 좋은 프로그래밍이 아니므로 올바른 방법이 있다고 확신합니다.

PendingResult가 발견되었지만 API 레벨 11이므로 너무 높습니다. 어떤 제안? 그것은 여러 구성 요소에서 사용하고 응용 프로그램에 대한 진정한 "글로벌"인 경우

답변

1

, 당신은 Application 객체를 확장하고 거기에 사용할 수 있습니다. 이는 구성 요소 중 하나가 으로 할당됨을 의미하며 구성 요소 중 하나라도 액세스 할 수있는 구성 요소 중 하나가 으로 시작됩니다. 또한 "안전"하며 Application 개체와 마찬가지로 수명주기를 벗어나는 "전역"변수로 많은 사람들이 권장합니다. 두 구성 요소가 같은 순간에 읽고 쓰는 것이 아니라면 괜찮을 것입니다. 거기에서 문제가 발생하면 코드를 동기화하여 스레드로부터 안전하게 만들 수 있습니다.

응용 프로그램 확장에 대한 경고 단어. 여러 객체를 액세스해야하는 모든 작업에 사용해서는 안됩니다. 수명주기를 벗어난 상태로 유지해야하는 데이터에만 사용해야합니다.

Application을 확장하고 새 데이터에 액세스하는 방법에 대한 설명이 필요하면 알려주십시오. 이 도움이

희망, FuzzicalLogic

+0

나는이 코드를 다른 파일에 http://pastebin.com/mXG6iyW6 클래스 애플리케이션에 넣었으며 매니페스트에 추가했다.하지만 여전히 null을 얻고있다. 나는 무엇을 이해하지 못합니까? – Tiago

+0

내 문제를 이해할 수 있도록 코드를 편집했습니다. – Tiago

+0

제가 보겠습니다. Null은 우리가 다루어야하는 것 중 하나 일뿐입니다. :) –

관련 문제