Как ждать завершения приема Broadcast Receiver - PullRequest
3 голосов
/ 05 января 2012

У меня есть метод, при котором я регистрирую широковещательные приемники, используя фильтры намерений для обнаружения устройств Bluetooth.

// global variable
 String xpto = "empty";

Вот метод 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());

Моя проблема:код в этом методе выполняется последовательно, к тому времени, когда я пытаюсь использовать (в этом методе в последовательности) некоторые глобальные переменные, которые я выделяю в Broadcast Receiver, они все еще null или пусты.

Хотя в некоторых «решениях» я, например, переносил свой «основной код» с места на приемник широковещания, или когда какая-то другая глобальная переменная была присвоена 1, когда BR завершен (и некоторое время x =! 1 восновной код, чтобы ждать) но это не хорошее программирование, я уверен, что есть правильный способ сделать это.

Я нашел PendingResult, но уровень API 11 слишком высок для меня.Есть предложения?

Ответы [ 2 ]

1 голос
/ 22 января 2012

Может быть, вы можете использовать wait () и notify () .. Позаботьтесь, чтобы это было синхронизировано:

NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

synchronized (nm) {
            try {
                // Esperar a que finalice la descarga
                nm.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

См. Потоки в Java: как заблокировать объект? а также как запустить уведомление от BroadcastReceiver?

1 голос
/ 05 января 2012

Если он используется несколькими компонентами и действительно является «глобальным» для вашего приложения, вы можете расширить объект Application и использовать его там.Это означает, что он будет выделен до того, как запустит любой из ваших компонентов , а будет доступен для всех ваших компонентов.Это также «безопасно» и рекомендуется многими, поскольку «глобальные» переменные находятся за пределами жизненного цикла, как и объект Application.Пока оба компонента не читают и не пишут в одно и то же время, все будет в порядке.Если вы предвидите проблему там, вы также можете сделать ее поточно-ориентированной, синхронизируя ее.

Слово с предупреждением о расширении Приложения.Это не должно использоваться для всего, что требует нескольких объектов для доступа к нему.Это должно использоваться только для данных, которые должны оставаться вне жизненного цикла из-за необходимости.

Пожалуйста, дайте мне знать, если вам нужно разъяснить, как расширить Application и получить доступ к новым данным.

Надеюсь, это поможет, FuzzicalLogic

...