W mojej aplikacji używam AsyncTask
do zapisu niektórych danych do bazy danych w transakcji. Dostęp do tej bazy danych jest również możliwy z poziomu wątku interfejsu użytkownika. Przeglądając dostępne metody bazy danych, natrafiłem na yieldIfContendedSafely()
. Wygląda na to, że ta metoda powinna być stosowana w każdym przypadku, gdy transakcja jest wykonywana z oddzielnego wątku. Ale nie ma prawie żadnej dokumentacji dotyczącej tej metody, oprócz następujących:Prawidłowe użycie yieldIfContendedSafely() w aplikacji wielowątkowej z systemem Android
Tymczasowo zakończ transakcję, aby umożliwić uruchamianie innych wątków. Zakłada się, że transakcja zakończyła się pomyślnie. Nie dzwoń pod numer
setTransactionSuccessful
przed wywołaniem tego. Gdy to zwróci, nowa transakcja zostanie utworzona, ale nie zostanie oznaczona jako udana. Zakłada się, że nie ma zagnieżdżonych transakcji (tylko jeden raz została wywołana) i spowoduje wyjątek, jeśli tak nie jest.
Oto jak Przypuszczam, że można użyć tej metody z wątku:
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();
}
Czy to jest prawidłowy sposób na wykorzystanie tej metody? Czy można używać więcej niż jeden raz w tej samej transakcji, między wieloma zapisami do różnych tabel w bazie danych? Jakieś sugestie?