2011-02-18 3 views
6

Dans mon application, j'utilise un AsyncTask pour écrire des données dans une base de données dans une transaction. Cette base de données est également accessible depuis le thread UI. Tout en regardant à travers les méthodes de base de données disponibles, je suis tombé sur yieldIfContendedSafely(). Il semble que cette méthode devrait être utilisée pour tous les cas où une transaction est faite à partir d'un thread séparé. Mais il n'y a pratiquement aucune documentation sur cette méthode autre que la suivante:Utilisation correcte de yieldIfContendedSafely() dans une application multithread Android

Termine temporairement la transaction pour laisser les autres threads s'exécuter. La transaction est considérée comme réussie jusqu'à présent. N'appelez pas setTransactionSuccessful avant de l'appeler. Lorsque cela retourne une nouvelle transaction aura été créée mais pas marquée comme réussie. Cela suppose qu'il n'y a pas de transactions imbriquées (beginTransaction n'a été appelée qu'une seule fois) et émettra une exception si ce n'est pas le cas.

Voici comment je suppose que vous utilisez cette méthode à partir d'un fil:

 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(); 
    } 

Est-ce la bonne façon d'utiliser cette méthode? Est-il correct d'utiliser db.yieldIfContendedSafely() plus d'une fois dans la même transaction, entre plusieurs écritures à différentes tables dans la base de données? Aucune suggestion?

Répondre

6

Tirer quelques exemples de code des bibliothèques Android, il semble beaucoup plus simple à utiliser que ...

Ceci est pris de 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; 
} 

En regardant également dans le code source de la fonction elle-même, il semble que, si cédé, l'appel différera l'exécution de votre thread pour une courte période dans tous les cas.

Questions connexes