2013-12-18 13 views
9

Nella mia app, sto usando un adattatore di sincronizzazione dei contatti, ma ha molte informazioni che condivide con l'app principale. Ci sono delle impostazioni che l'adattatore ha bisogno di lavorare su proplery (come le informazioni di accesso e se l'utente cambia le impostazioni di sincronizzazione), quindi attualmente lo faccio girare nello stesso processo, e comunica con l'ap principale usando getApplicationContext(), e poi ne ho alcune variabili condivise nello Application che l'adattatore di sincronizzazione sta utilizzando durante il processo di sincronizzazione.In Android, una scheda di sincronizzazione dei contatti dovrebbe essere eseguita in un processo separato?

Ma nel training document e alcuni tutorial online, l'adattatore di esempio è impostato per essere eseguito nel proprio processo, utilizzando android:process=":sync" nel file manifest. È necessario? E se viene eseguito in un processo separato, come posso comunicare di nuovo all'app principale?

risposta

2

Nel nostro contesto, a causa dei requisiti di ricerca rapida, stiamo utilizzando il servizio remoto per conservare un enorme database in memoria.

Il motivo per cui utilizziamo il servizio remoto, invece del servizio locale è che, crediamo che l'esecuzione del servizio in un processo separato, ci renderà più difficile raggiungere la memoria massima per limitazione del processo (La limitazione è variabile in base a diversi dispositivi e sistema operativo versione).

Nella nostra progettazione iniziale, stiamo usando AIDL. Più tardi, passiamo a Messenger. Non riesco a ricordare la ragione dietro. Controllerò il nostro log della cronologia del codice sorgente per capire perché. Ma, penso che sia principalmente, Messenger è meno complicato di AIDL, e non abbiamo bisogno della funzionalità multi-thread fornita da AIDL.

1

esecuzione Service nel proprio processo può essere utile

1) se si desidera che il servizio di sopportare la distruzione processo della tua applicazione principale (ma START_STICKY è più che sufficiente per questo caso),

2) se si desidera designare questo processo per tutte le attività di "sincronizzazione" dell'applicazione (come indicato nello tutorial),

3) se vuoi che altre app usino il tuo Servizio.

Per comunicare con Service in esecuzione in un processo separato, utilizzare Bound Services.

Tuttavia, l'esecuzione del Servizio in un processo separato aumenta la complessità della comunicazione con esso, quindi considera se uno dei casi sopra menzionati si riferisce agli scopi della tua app.

+1

Lo eseguirà in un processo separato per eliminare i rallentamenti causati quando è necessario sincronizzare un numero enorme di contatti? In questo momento sta succedendo per gli utenti che sincronizzano oltre 5000 contatti. – user496854

+0

Per evitare rallentamenti, esegui la sincronizzazione in un [thread separato] (http://developer.android.com/guide/components/processes-and-threads.html#Threads), non è necessario immergersi nell'overhead del processo separato per questo motivo . –

+0

Non è in esecuzione un adattatore di sincronizzazione in un thread separato piuttosto inutile? PreformSync uscirà mentre il thread è ancora in esecuzione, il che ucciderebbe il servizio e perderebbe il thread. Inoltre, l'adattatore di sincronizzazione segnerà la sincronizzazione come completata, ma in realtà non lo è e ciò potrebbe causare problemi importanti. – user496854

0

Penso che dovrebbe essere separato, ma non è necessario.

In generale, vale la pena considerare la separazione di un processo Service se può essere utilizzato indipendentemente dai componenti di sistema o da altre applicazioni. In questa prospettiva, il ciclo di vita del processo deve essere gestito in modo indipendente da altri componenti come Activity nella stessa app, quindi Android può contrassegnare quale processo è attualmente utilizzato in modo facile e preciso per decidere quale processo deve essere eliminato in caso di mancanza di memoria. Inoltre, il servizio può continuare a funzionare anche se l'attività frontale si è arrestata in modo imprevisto.

È difficile mantenere la condivisione dei dati tra processi separati. Per le credenziali e le preferenze di accesso, suppongo che potresti utilizzare una combinazione di SharedPreferences e OnSharedPreferenceChangeListener.

0

All'avvio dell'applicazione, è possibile memorizzare nella cache elementi diversi, in particolare per l'interfaccia utente. Suddividendo la logica di sincronizzazione in un processo diverso, consenti al processo di UI di essere ucciso quando il dispositivo sta esaurendo la memoria, il che libererà queste cache dell'interfaccia utente.

Quindi, questa tecnica è principalmente di interesse per le app che eseguono servizi per un lungo periodo di tempo. Esempi tipici:

  • il servizio che suona musica in un'applicazione musicale
  • il servizio che carica il video su Youtube

Tuttavia:

  • questo aumenta la complessità delle app
  • se eseguito in modo errato, può effettivamente aumentare l'ingombro di memoria complessivo dell'app
Problemi correlati