Autore Topic: StartActivityForResult bloccante  (Letto 947 volte)

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
StartActivityForResult bloccante
« il: 11 Maggio 2012, 20:50:38 CEST »
0
Ciao a tutti,
conoscete una buona strutturazione per rendere questa operazione bloccante?Mi serve il risultato prima di proseguire ma i meccanismi di sleep e wait mi bloccano l'intera app...

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:StartActivityForResult bloccante
« Risposta #1 il: 12 Maggio 2012, 08:48:54 CEST »
0
Ciao a tutti,
conoscete una buona strutturazione per rendere questa operazione bloccante?Mi serve il risultato prima di proseguire ma i meccanismi di sleep e wait mi bloccano l'intera app...

Dovresti spiegarci in dettaglio cosa vuoi ottenere, perchè quando si usano sleep e wait nel 99% dei casi vuol dire che c'è qualcosa di fondamentalmente errato.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline zaxxon

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Archos 101 G9
  • Sistema operativo:
    Ubuntu 10.04
Re:StartActivityForResult bloccante
« Risposta #2 il: 12 Maggio 2012, 17:09:19 CEST »
+1
Essendo Android un OS orientato agli eventi, forse la struttura migliore per gestire l'applicazione è una macchina a stati.
Supponiamo che tu debba eseguire questi compiti in sequenza:
Codice: [Seleziona]
[ Sequenza 1 ]
          |
[ Nuova Activity per input ]
          |
[ Sequenza 2 ]
          |
[ Altra Activity per input ]
          |
[ Sequenza 3 ]

Allora avrai una variabile di istanza Stato inizializzata a 0 in fase di creazione. Poi esegui la Sequenza 1 cambi lo Stato in 1 lanci l'Activity con startActivityForResult() e qui il metodo termina.
Poi nel metodo onActivityResult() se lo Stato vale 1 esegui le azioni di Sequenza 2, setti lo Stato a 2, chiami l'altra Activity e termini il metodo. Se invece lo Stato vale 2 esegui le azioni di Sequenza 3 e termini il programma.

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:StartActivityForResult bloccante
« Risposta #3 il: 13 Maggio 2012, 02:15:42 CEST »
0
Capito, un po' macchinoso ma cercherò di adattarmi...grazie zoxxan!

Dovresti spiegarci in dettaglio cosa vuoi ottenere, perchè quando si usano sleep e wait nel 99% dei casi vuol dire che c'è qualcosa di fondamentalmente errato.
Passi per lo sleep ma...secondo te il problema produttore-consumatore è una favoletta per bambini eh? ;-)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:StartActivityForResult bloccante
« Risposta #4 il: 13 Maggio 2012, 08:54:48 CEST »
0
Capito, un po' macchinoso ma cercherò di adattarmi...grazie zoxxan!
Passi per lo sleep ma...secondo te il problema produttore-consumatore è una favoletta per bambini eh? ;-)

No, è che non capivo (e in tutta onestà nemmeno adesso capisco) cosa abbiano a che vedere sleep/wait con StartActivityForResult.

Dalla risposta di zaxxon intuisco che tu potresti avere un thread parallelo in esecuzione, tu apri varie sub-activity, ritorni a quella primaria e vuoi che il thread reagisca al risultato che le varie sub-activity restituiscono. Un modo è appoggiarsi alla variabile condivisa sincronizzata (la variabile di stato di zaxxon), oppure (a me piace molto di più) ci sono i messaggi, che hanno molta più versatilità. Ovviamente se ho intuito la natura del problema.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:StartActivityForResult bloccante
« Risposta #5 il: 13 Maggio 2012, 10:07:33 CEST »
0
Ti spiego subito: la mia app sfrutta il bluetooth, che potrebbe non essere attivo all'inizio.
Ora, quando l'utente preme un tasto, nell'evento devo gestire questa cosa e volevo qualcosa così:
Codice: [Seleziona]
if(!bluetooth){
Intent blablabla

wait until bluetooth active
}
...code...

insomma, siccome il codice dopo vuole il bluetooth attivo l'idea era sospendermi in attesa di quell'evento prima di andare avanti.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:StartActivityForResult bloccante
« Risposta #6 il: 13 Maggio 2012, 11:34:38 CEST »
+1
insomma, siccome il codice dopo vuole il bluetooth attivo l'idea era sospendermi in attesa di quell'evento prima di andare avanti.

Se il codice in questione viene eseguito nel main thread (cioè quello di UI), non puoi attendere. Come avrai notato si congela tutta la UI e se l'attesa dura oltre 5 secondi, l'applicazione viene terminata da Android stesso (errore Application Not Responding : Force Close). Se invece l'attesa è in un thread secondario allora ok. Nota a margine: se le attese durano poco, di fatto non occorre usare thread secondari, ma è una cosa del tutto incidentale.

Il mio consiglio è di ripensare in modo asincrono le parti in cui ci sono delle attese, lavorare cioè con eventi: se bluetooth non è attivato, richiedo attivazione bluetooth e attendo evento di bluetooth attivato, appena arriva l'evento bluetooth attivato eseguo il codice successivo. L'applicazione è in questo caso implicitamente più robusta, perchè se l'utente non da' il consenso all'attivazione oppure chiude l'app, non è rimasto niente in sospeso.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Phate

  • Utente junior
  • **
  • Post: 123
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S
  • Sistema operativo:
    Windows 7
Re:StartActivityForResult bloccante
« Risposta #7 il: 13 Maggio 2012, 12:09:01 CEST »
0
Sisi infatti è giusto ragionare nell' "android way" e ho fatto una cosa simile a quella suggerita da zaxxon!
Grazie a entrambi!