2011-02-18 8 views
6

En mi aplicación, estoy usando un AsyncTask para escribir algunos datos en una base de datos en una transacción. También se accede a esta base de datos desde el hilo de la interfaz de usuario. Al mirar a través de los métodos de base de datos disponibles, me encontré con yieldIfContendedSafely(). Parece que este método se debe usar para cualquier caso en el que se realice una transacción desde un hilo separado. Pero apenas hay documentación sobre este método que no sea la siguiente:Uso adecuado de yieldIfContendedSafely() en una aplicación multiproceso de Android

Finalice temporalmente la transacción para permitir que se ejecuten otros subprocesos. Se supone que la transacción fue exitosa hasta el momento. No llame al setTransactionSuccessful antes de llamar a esto. Cuando esto vuelva, se habrá creado una nueva transacción pero no se marcará como exitosa. Esto supone que no hay transacciones anidadas (solo se ha llamado al beginTransaction una vez) y lanzará una excepción si ese no es el caso.

Así es como yo asumiría que utilizaría este método de un hilo:

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

¿Es esta la forma correcta de utilizar este método? ¿Está bien usar db.yieldIfContendedSafely() más de una vez en la misma transacción, entre múltiples escrituras en diferentes tablas en la base de datos? ¿Alguna sugerencia?

Respuesta

6

Tirando de un código de ejemplo de las bibliotecas de Android se parece mucho más fácil de usar que eso ...

Esto está tomado 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; 
} 

También mirando en el código fuente para la función en sí, parece que, si se produce, la llamada diferirá la ejecución de su hilo por un corto período en cualquier caso.

Cuestiones relacionadas