2011-02-18 111 views
6

在我的應用程序中,我使用AsyncTask將一些數據寫入事務中的數據庫。這個數據庫也可以從UI線程訪問。在查看可用的數據庫方法時,我遇到了yieldIfContendedSafely()。似乎這種方法應該用於從單獨的線程進行交易的任何情況。但除此之外幾乎沒有關於此方法的任何文檔:在Android多線程應用程序中正確使用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()是否可以在對數據庫中不同表的多次寫入之間使用?有什麼建議麼?

回答

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; 
} 
採取

同樣考慮到函數本身的源代碼,看起來,如果放棄,調用會在任何情況下推遲執行線程。