Concorrenza con ascoltatori e upload: questa soluzione è valida?

4

Sto lavorando su un'app per Android.

Abbiamo ascoltatori per i dati di posizione e l'acquisizione della telecamera che è temporizzata su un thread in background (non un servizio).

Il thread del timer determina quando viene catturata l'immagine e anche quando i dati vengono memorizzati nella cache in un db sqlite locale.

Quindi, la mia domanda è come archiviare correttamente i dati sulla posizione così come sono in base agli ascoltatori e tirare quei dati in modo che il database possa essere aggiornato mentre viene eseguita l'acquisizione della telecamera.

Non riesco a inserire i dati di localizzazione nel database non appena arriva, poiché vengono elaborati più frequentemente rispetto alle immagini della fotocamera e le immagini della videocamera sono ciò che domina l'architettura al momento. (I dati sulla posizione sono supplementi). Tuttavia ho bisogno dei dati sulla posizione per ottenere una posizione approssimativa in cui viene catturata l'immagine.

Il mio primo pensiero è stato quello di avere il negozio singleton dei dati sulla posizione. E avere un semaforo sul metodo getInstance, quindi se l'aggiornamento del database sta accadendo (dopo che un'immagine è stata catturata) non abbiamo un errore. I dati sulla posizione possono attendere l'aggiornamento del database o possono essere persi per quel particolare evento che non ha davvero importanza.

Che cosa pensi? Sono sulla buona strada? (E questo è il sito secondario giusto o sarebbe meglio su stackoverflow?)

    
posta cbrulak 30.05.2012 - 01:11
fonte

1 risposta

2

Penso che tu abbia capito bene. Idealmente si vorrebbe che il thread in background gestisca la telecamera per inviare dati direttamente al database e quindi evitare l'uso del singleton. Ciò consente al database di gestire tutti i problemi di concorrenza. Ma tu devi scambiare un po 'di sicurezza per le prestazioni.

Hai bisogno della tua immagine e dei dati correlati in un posto dove possa essere referenziato da più thread. Il singleton andrà bene per questo (ma pensate di destreggiarsi più di una foto in una volta - scriverete un codice migliore). Assicurarsi che tutti i riferimenti ai dati siano sincronizzati. Usa wait e notifyAll per segnalare che un'immagine è pronta. E leggi tutto quello che puoi trovare sui problemi del multithreading: è un lavoro difficile e pericoloso.

In alternativa (pensato solo a questo), potresti essere in grado di evitare il multithreading - o almeno i problemi di multitheading - usando java.util.concurrent.ConcurrentLinkedQueue. Un'istanza non dovrebbe essere sincronizzata. Il thread della fotocamera potrebbe creare un oggetto dati, aggiungere ( offer ) alla coda e azzerarne il riferimento. Dovrebbe segnalare il thread principale per far sapere che era pronto. Quindi il tuo thread principale potrebbe prenderlo (usando poll ). Una volta che il tuo thread principale ha l'oggetto dati, non sarebbe più visibile da nessun'altra parte. La coda potrebbe funzionare come un DB nell'assumersi la responsabilità del multithreading.

(Potrebbero funzionare anche molte altre raccolte simultanee, ma assicurati di leggere e rimuovere in un unico metodo o potresti trovare, un giorno, che due thread eseguono la lettura prima di una rimozione e entrambi pensano di avere accesso esclusivo ai dati.)

    
risposta data 30.05.2012 - 17:44
fonte

Leggi altre domande sui tag