2011-02-18 3 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()を複数回、データベースの異なるテーブルへの複数回の書き込みの間に複数回使用することは問題ありませんか?助言がありますか?それはそうAndroidのライブラリからいくつかのサンプルコードを引っ張る

答えて

6

くらいよりも使用するように...

これは

@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; 
} 
com.android.providers.calendar.SQLiteContentProvider.java

から取られているシンプルな

また、関数自体のソースコードを調べると、何らかの短期間で呼び出しがスレッドの実行を延期するように見えます。

関連する問題