Autore Topic: Wait come usarlo?  (Letto 536 volte)

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Wait come usarlo?
« il: 04 Maggio 2015, 13:21:47 CEST »
0
Salve,
nell'applicazione che sto sviluppando devo controllare l'attivazione del bluetooth e bloccare l'attivazione di alcuni processi fino a quando il bluetooth non sarà stato attivato.
Come potrei fare?
Ho implementato questa funzione nel main :
Codice (Java): [Seleziona]
public  synchronized  void checkConnessioneBT(){
         // Get local Bluetooth adapter
    SingletonClass.getSingletonIstance().setmBluetoothAdapter(BluetoothAdapter.getDefaultAdapter());
    while(!SingletonClass.getSingletonIstance().getmBluetoothAdapter().isEnabled()) {
                try {
                         startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 0);
                        wait();
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
    }
}
ma dopo che ho attivato il Bluetooth l'applicazione sembra essere bloccata.
Potreste aiutarmi ?
Grazie.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1198
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Wait come usarlo?
« Risposta #1 il: 04 Maggio 2015, 13:27:44 CEST »
0
Non puoi avere un loop nel onCreate(). O meglio nel main thread. Crea un thread a parte. Scegli fra handler o Asynktask cosa più ti soddisfa

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Wait come usarlo?
« Risposta #2 il: 04 Maggio 2015, 13:51:58 CEST »
0
Ciao Tonno16,
ho provato ad usare l'handler nel seguente modo

Codice (Java): [Seleziona]
protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                ...
                ...
                /*CONTROLLO LOGIN*/
                handler = new Handler();
                SingletonClass.getSingletonIstance().setmBluetoothAdapter(BluetoothAdapter.getDefaultAdapter());
                new Thread(new Task()).start();
               
                controlloSessione();
               
                function1();   
               
        }

class Task implements Runnable {

@Override
public void run() {

   

                 // Get local Bluetooth adapter
               
                /*Se il BT non è attivo si invia una richiesta all'utente  di abilitazione*/
                // setupChat() will then be called during onActivityResult
                if (!SingletonClass.getSingletonIstance().getmBluetoothAdapter().isEnabled()) {
                         startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 0);
                }

            }

 }

ma l'applicazione continua a crashare, in pratica i metodi  controlloSessione() e function1()    vengono eseguiti in parallelo all'handler.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1198
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Wait come usarlo?
« Risposta #3 il: 04 Maggio 2015, 14:11:54 CEST »
0
Che errore hai? Log?

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Wait come usarlo?
« Risposta #4 il: 04 Maggio 2015, 21:43:34 CEST »
0
Io direi di non usarlo.

Utilizza una callback, o un Broadcast receiver, che vengono chiamati esattamente quando il Bluetooth è disponibile.

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Wait come usarlo?
« Risposta #5 il: 05 Maggio 2015, 09:25:30 CEST »
0
L'errore è relativo al fatto che l'applicazione continua ad andare avanti senza aspettare l'attivazione del BT e quindi quando viene attivato un metodo che richiede connessione BT , senza che essa sia già stato attivato, l'applicazione crasha :(

iClaude

  • Visitatore
Re:Wait come usarlo?
« Risposta #6 il: 05 Maggio 2015, 10:38:35 CEST »
0
Ciao Tonno16,
ho provato ad usare l'handler nel seguente modo

Codice (Java): [Seleziona]
protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                ...
                ...
                /*CONTROLLO LOGIN*/
                handler = new Handler();
                SingletonClass.getSingletonIstance().setmBluetoothAdapter(BluetoothAdapter.getDefaultAdapter());
                new Thread(new Task()).start();
               
                controlloSessione();
               
                function1();   
               
        }

class Task implements Runnable {

@Override
public void run() {

   

                 // Get local Bluetooth adapter
               
                /*Se il BT non è attivo si invia una richiesta all'utente  di abilitazione*/
                // setupChat() will then be called during onActivityResult
                if (!SingletonClass.getSingletonIstance().getmBluetoothAdapter().isEnabled()) {
                         startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 0);
                }

            }

 }

ma l'applicazione continua a crashare, in pratica i metodi  controlloSessione() e function1()    vengono eseguiti in parallelo all'handler.

Beh, intanto non puoi chiamare startActivity in un thread separato...
La richiesta di attivare il bluetooth deve essere sincrona: l'utente lascia l'applicazione ed attiva il bluetooth, quindi ritorna alla app.
Devi invertire la logica di funzionamento: non è che blocchi certe funzioni fino a quando il bluetooth è disattivato. Viceversa le attivi solo quando è attivato. L'app non può andare in crash o restare sospesa perché il bluetooth è disattivato.
Qua una guida completa su come procedere: Bluetooth | Android Developers

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Wait come usarlo?
« Risposta #7 il: 05 Maggio 2015, 13:52:30 CEST »
0
Ciao iClaude,
quindi secondo te non lo dovrei richiamare nella main activity ?

iClaude

  • Visitatore
Re:Wait come usarlo?
« Risposta #8 il: 05 Maggio 2015, 14:32:45 CEST »
0
Ciao iClaude,
quindi secondo te non lo dovrei richiamare nella main activity ?

Dove vuoi,  ma non in un thread separato.
Se hai delle funzioni che richiedono il bluetooth il flusso è  questo:
- controlli se il bluetooth è  disponibile e attivato
- se non è  attivato mostri all'utente una finestra di dialogo con la quale gli dai la possibilità di attivare il bluetooth. Qua chiami startActivity per aprire le impostazioni di Android ed attivare il bluetooth, ma nel thread principale però
- solo quando l'utente attiva il bluetooth attivi le funzioni che lo richiedono

Offline Raffyna

  • Utente junior
  • **
  • Post: 104
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    htc wildfire
  • Sistema operativo:
    seven
Re:Wait come usarlo?
« Risposta #9 il: 05 Maggio 2015, 15:00:53 CEST »
0
Il problema è  attivare le funzioni "solo quando l'utente attiva il bluetooth". :(