2017-02-27 2 views
0

에 영역 트랜잭션을 처리하기 위해, 나는 다음과 같이 패턴을 봤어요? "workWithRealmData()"함수가 예외를 throw하면 트랜잭션이 취소되지 않습니다. 그러나 우리는 어쨌든 마침내 자원을 사용하여 결국 영역을 닫습니다.어떻게 거기에 샘플 코드의 여러 조각에서 안드로이드

더 안전한 구조는 다음과 같습니다 안전한 보이는

try (Realm realm = Realm.getDefaultInstance()) { 
    realm.beginTransaction(); 
    try { 
    workWithRealmData(); 
    realm.commitTransaction(); 
    } finally { 
    if (realm.isInTransaction()) { 
     realm.cancelTransaction(); 
    } 
    } 
} 

-도하지만 모든 callsites에 대한 코드를 상당히 지저분 보인다.

정말이 문제는 - 영역이 즉시 닫히거나 취소되면 cancelTransaction을 무시하는 것이 안전할까요? 그렇지 않다면 무엇이 잘못 될 수 있습니까?

+0

그 후에 바로 영역을 닫으면 'cancelTransaction'을 무시해도 안전합니다. 그래도 한 곳을 놓치면 실을 막을 것이기 때문에 내게는 조금 안전하지 않다고 느낍니다. –

+0

위대한 - 확인을위한 감사, 기독교! – tmtrademark

답변

1

executeTransaction(Realm.Transaction) 오류가 발생하면 자동으로 동기 트랜잭션을 취소하는 방법을 사용할 수 있습니다.

try(Realm r = Realm.getDefaultInstance()) { 
    r.executeTransaction((realm) -> { 
     workWithRealmData(); 
    }); 
} 
+0

그건 좋은 제안입니다 - 고마워요! 그래도 원래 코드 샘플의 동작에 대해서는 궁금합니다. 내가 이해하는 바와 같이, 여러분이 제안한 샘플은 새로운 익명 클래스를 만드는 것과 관련이 있습니다. 그리고 유닛 테스트 프레임 워크에서 작업하는 것은 다소 고통 스럽습니다. 영역은 조롱을받을 수 없기 때문에 (마지막으로 살펴 보았습니다). – tmtrademark

+0

2.2.2에서는 모든 Realm 클래스를 non-final로 만들었으므로 Mockito를 사용하여 모든 클래스를 모의 할 수 있어야합니다. –

+0

'executeTransaction'의 소스 코드를 확인하면 맨 위에 표시 한 것과 거의 같습니다. – EpicPandaForce