2011-02-18 15 views
6

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?

Odpowiedz

6

Ciągnięcie jakiś przykładowy kod z Androidem bibliotek wydaje znacznie prostszy w użyciu niż ...

To jest wzięte z com.android.providers.calendar.SQLiteContentProvider.java

@Override 
public int bulkInsert(Uri uri, ContentValues[] values) { 
    int numValues = values.length; 
    mDb = mOpenHelper.getWritableDatabase(); 
    mDb.beginTransactionWithListener(this); 
    try { 
     for (int i = 0; i < numValues; i++) { 
      Uri result = insertInTransaction(uri, values[i]); 
      if (result != null) { 
       mNotifyChange = true; 
      } 
      mDb.yieldIfContendedSafely(); 
     } 
     mDb.setTransactionSuccessful(); 
    } finally { 
     mDb.endTransaction(); 
    } 

    onEndTransaction(); 
    return numValues; 
} 

Również patrząc na kod źródłowy dla samej funkcji, wydaje się, że jeśli otrzymasz, połączenie w każdym przypadku odracza wykonanie wątku na krótki okres.

Powiązane problemy