7

在我的应用程序中,我使用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();
    }

这是使用此方法的正确方法吗?db.yieldIfContendedSafely()在同一个事务中,在对数据库中不同表的多次写入之间,是否可以多次使用?有什么建议么?

4

1 回答 1

6

从 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;
}

还查看函数本身的源代码,似乎,如果产生,调用将在任何情况下将您的线程的执行推迟一小段时间。

于 2011-05-12T11:14:39.173 回答