Jam*_*mes 7 multithreading android android-sqlite
在我的应用程序中,我使用a AsyncTask将一些数据写入事务中的数据库.也可以从UI线程访问此数据库.在查看可用的数据库方法时,我遇到了yieldIfContendedSafely().看起来这个方法应该用于从单独的线程进行事务的任何情况.但除了以下内容之外,几乎没有关于此方法的任何文档:
暂时结束事务以允许其他线程运行.到目前为止,该交易被认为是成功的.在打电话
setTransactionSuccessful之前不要打电话.返回时,将创建一个新事务但未标记为成功.这假定没有嵌套事务(beginTransaction仅被调用一次)并且如果不是这种情况将抛出异常.
以下是我将如何假设您将从线程中使用此方法:
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();
}
Run Code Online (Sandbox Code Playgroud)
这是使用此方法的正确方法吗?是否可以db.yieldIfContendedSafely()在同一个事务中多次使用,在多次写入数据库中的不同表之间?有什么建议?
从Android库中提取一些示例代码似乎比使用它更简单...
这取自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;
}
Run Code Online (Sandbox Code Playgroud)
同时查看函数本身的源代码,似乎如果屈服,调用将在任何情况下推迟执行您的线程一小段时间.
| 归档时间: |
|
| 查看次数: |
1758 次 |
| 最近记录: |