2011-02-18 5 views
6

제 응용 프로그램에서는 AsyncTask을 사용하여 트랜잭션의 일부 데이터를 데이터베이스에 쓸 수 있습니다. 이 데이터베이스는 UI 스레드에서도 액세스 할 수 있습니다. 사용 가능한 데이터베이스 메소드를 살펴본 결과 yieldIfContendedSafely()이 나타났습니다. 이 메서드는 트랜잭션이 별도의 스레드에서 만들어지는 모든 경우에 사용해야합니다. 그러나이 방법에 대한 문서는 거의 다음과 같습니다.Android 다중 스레드 응용 프로그램에서 yieldIfContendedSafely()를 올바르게 사용하십시오.

일시적으로 다른 스레드를 실행할 수 있도록 트랜잭션을 종료합니다. 지금까지 거래가 성공적이라고 가정합니다. 전화를 걸기 전에 setTransactionSuccessful으로 전화하지 마십시오. 이 때 새로운 트랜잭션이 생성되었지만 성공으로 표시되지는 않습니다. 이것은 중첩 된 트랜잭션이 없다고 가정하고 (beginTransaction은 한 번만 호출되었습니다) 그렇지 않은 경우 예외를 throw합니다.

 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

많은보다 사용하기 ...

@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

에서 가져 간단

또한 함수 자체의 소스 코드를 살펴보면 어떤 경우에도 짧은 기간 동안 호출이 스레드 실행을 지연시키는 것으로 보입니다.

관련 문제