Nella mia applicazione, sto utilizzando uno AsyncTask
per scrivere alcuni dati in un database in una transazione. È possibile accedere a questo database anche dal thread dell'interfaccia utente. Guardando attraverso i metodi di database disponibili, mi sono imbattuto in yieldIfContendedSafely()
. Sembra che questo metodo dovrebbe essere utilizzato per tutti i casi in cui una transazione viene effettuata da un thread separato. Ma quasi nessun documento su questo metodo è diverso da quello seguente:Uso corretto di yieldIfContendedSafely() in un'applicazione Android con multithreading
Termina temporaneamente la transazione per consentire l'esecuzione di altri thread. Si presume che la transazione abbia avuto esito positivo finora. Non chiamare
setTransactionSuccessful
prima di chiamare questo. Quando questo restituisce una nuova transazione sarà stata creata ma non contrassegnata come riuscita. Ciò presuppone che non vi siano transazioni nidificate (beginTransaction
è stato chiamato una sola volta) e genererà un'eccezione se non è così.
Ecco come presumo che si può usare questo metodo a un filo:
try {
db.beginTransaction();
//insert some stuff into the database here
...
// is this how you use this method?
boolean yielded = db.yieldIfContendedSafely();
if (yielded) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
db.setTransactionSuccessful();
} catch (SQLException e) {
return false;
} finally {
db.endTransaction();
db.close();
}
È questo il modo corretto di utilizzare questo metodo? Va bene usare db.yieldIfContendedSafely()
più di una volta nella stessa transazione, tra più scritture su diverse tabelle nel database? Eventuali suggerimenti?