Правильное использование yieldIfContendedSafely() в многопоточном приложении Android

StackOverflow https://stackoverflow.com/questions/5036939

Вопрос

В своем приложении я использую AsyncTask для записи некоторых данных в базу данных в транзакции.Доступ к этой базе данных также осуществляется из потока пользовательского интерфейса.Просматривая доступные методы работы с базами данных, я наткнулся на 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() более одного раза в одной транзакции, между несколькими операциями записи в разные таблицы базы данных?Какие-либо предложения?

Это было полезно?

Решение

Кажется, я вытащил пример кода из библиотек 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;
}

Кроме того, если посмотреть исходный код самой функции, кажется, что в случае ее выполнения вызов в любом случае отложит выполнение вашего потока на короткий период.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top