Domanda

Ecco lo scenario:

  1. Ho 2 attività e uno di servizio
  2. In primo luogo l'attività è una pagina di destinazione vista / ricerca. Seconda azione visualizza i risultati della ricerca
  3. Ricerca viene sempre eseguito contro db SQLite interna
  4. Periodicamente (diciamo al giorno) db deve essere aggiornato dalla fonte remota, che è un processo lungo
  5. Se l'utente esegue la ricerca durante l'aggiornamento che voglio aspettare fino a quando l'aggiornamento è finito durante la visualizzazione di "attendere" avviso di avanzamento. Non voglio per eseguire query e risultati di ricerca fino a quando l'aggiornamento è completamente fatto.
  6. L'aggiornamento db è innescato da AlarmManager ed eseguito da un servizio che mette lo status di "AGGIORNAMENTO" in db, mentre l'aggiornamento è in corso
  7. Posso facilmente interrogare lo stato ma come faccio aspettare e periodicamente ri-interrogare il database? Sto usando AsyncTask per elaborare i risultati di ricerca e la mia reazione istintiva era di mettere un ciclo con wait () in metodo AsyncTask#doInBackground ma questo è pericoloso e semplicemente non funziona in quanto non sto controllando il thread UI così finisco con IllegalMonitorStateException.

Che cosa sarebbe un modo "giusto" di aspettare correttamente (può essere anche con l'aggiornamento di stato) in questo caso?

P.S. Ho messo il codice "attesa" in un Runnable e l'esecuzione di ancor prima di arrivare al mio AsyncTask. Funziona per esempio Thread.sleep(2000) ancora non sono sicuro che è il modo per farlo in modo sicuro. Qualcuno ha qualche esperienza con FutureTask?

È stato utile?

Soluzione

  

Se l'utente esegue la ricerca durante la   aggiorno voglio aspettare fino a quando l'aggiornamento   è finita durante la visualizzazione "Attendere"   avviso progresso. Non voglio interrogare   risultati e di ricerca fino a quando   aggiornamento è completamente fatto.

Questa è la vostra chiamata, ma tenere a mente che si sta creando il proprio problema. Personalmente, mi piacerebbe discarica questo requisito. L'utente non deve essere disturbato solo perché un allarme è scattato.

Per esempio, è possibile disattivare l'allarme e riattivarla quando l'attività va via.

In alternativa, hanno l'aggiornamento essere eseguito in modo tale che esso è atomico (ad esempio, fare l'aggiornamento su una copia della tabella, quindi sincronizzare le tabelle in una transazione), in modo che l'attività può ancora accedere in modo sicuro al database mentre l'aggiornamento è in corso.

  

Che cosa sarebbe un modo "giusto" per   correttamente attendere (può essere anche con lo stato   aggiornamento) in questo caso?

Avere il servizio dire l'attività quando l'aggiornamento è fatto, tramite una sorta di richiamata, o forse un intento di trasmissione. Mantenere l'indicatore di stato in vita fino a quando questo si verifica. Questo introduce ancora alcune sfide di temporizzazione, motivo per cui avevo appena discarica il requisito.

Altri suggerimenti

Grazie a Mark (come sempre) per indicazioni utili. Qui, ho intenzione di delineare come (nella mia mente) lo scenario di cui sopra dovrebbe essere fatto:

  1. Invece di frugare database semplicemente legano al servizio e iniziare in attesa
  2. Se non è possibile associare al servizio, allora non è in esecuzione quindi non c'è bisogno di scimmia con esso - basta interrogare il db e fare ciò che è necessario
  3. Quando il servizio è attivo, avviare in attesa ed elaborare tutte le risposte che il servizio invia indietro. Questi possono essere aggiornamenti intermedi e indicatore poi finale che il servizio viene fatto
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top