2014-10-28 3 views
7

내 응용 프로그램에서는 일반적으로 sqlite에서 데이터를로드 한 다음 해당 액티비티 또는 연결된 첨부 파일 (어댑터에 설정된 위치)로 전달하는 로더가 있습니다. 사용자에게 표시하는 absListView의 내용내 안드로이드에 대한 영역에서 다음을 달성하는 방법

영역은 objects shouldn't be shared across threads이므로 UI ​​스레드에서 db 호출을하지 않고 어떻게 구현할 수 있습니까? 에서 또한

(필자는 dB에게 좋은 금액 충돌로 응용 프로그램이 부진 느낌을 것이다) 3 examples-intro, & migrationgridView, DB 작업이 UI 스레드에서 수행되는 여러 번. 안드로이드에서 UI 스레드의 데이터베이스 조작이 크게 싫은가요? 워드 프로세서에서 인용

- Potentially long running operations such as network or database operations, or computationally expensive calculations such as resizing bitmaps should be done in a worker thread (or in the case of databases operations, via an asynchronous request).

답변

4

당신은 맞다 현재는 백그라운드 스레드에서 항목을로드 한 후 UI 스레드로 구문 분석 할 수 없습니다. 그러나 로드맵에있는 내용은 여기를 참조하십시오. https://github.com/realm/realm-java/issues/503

Realm은 매우 빠르므로 Realm은 매우 짧은 양의 데이터에 대해 UI 스레드에서 데이터를로드하더라도 프레임을 건너 뛰지 않을 것입니다.

+0

불행하게도 내가 많은 양의 데이터를 처리 한 후 간단한 객체 생성됩니다! 영역을 구현하기 전에 해당 기능이 망가질 때까지 기다릴 것입니다 –

+0

귀하의 경우에는 "많이"얼마입니까? – bmunk

+0

@ChristianMelChior : 안녕하세요. Realm은 사용자 정의 정렬 순서를 지원합니까? 예를 들어, 3 개의 필드가있는 테이블이 있습니다 : 지리적 위치의 이름, 위도와 경도. 현재 위치에서 거리에 따라 결과를 정렬하고 싶습니다 (사용자의 위치에 따라 다름). 감사합니다 – Rajat

2

사이트에서 처음으로 영역을 읽었을 때 벤치 마크 테스트를보고 매우 흥분했습니다. 그러나 제한 부분에 이르렀을 때 2 분 동안 붙어서 "스레드 간 개체 공유 방지"에 대해 생각하고있었습니다. 안쪽에서, 그것은 영역을 위해 간다라고 나에게 이야기하고 있었다. 그러나 그 제한은 나를 뒤로 붙들고있다. 그래서 마침내 나는 모든 스레드에서 그 객체를 공유 할 수있는 일종의 래퍼를 구현하기로 결정했다.

여기 있습니다. 디스크에 읽고 쓰는 프로세스는 간단한 개체 생성보다 시간이 오래 걸립니다. 이것이 래퍼 생성과 관련된 부분입니다.

1) realmObject의 하위 클래스 객체는 객체가 생성 된 동일한 스레드에서 객체 액세스 규칙에 관계없이 원하는 위치에 만들 수 있습니다.

예컨대

XyzsubclassofRealmObject xyzObject = new XyzsubclassofRealmObject(); 

2)의 데이터베이스 작업

예를 행하는 방법이 객체 합격

insertOrUpdate(xyzObject); 

//implementation 
insertOrUpdate(XyzsubclassofRealmObject object) //you can make this method generic to accept any object that is subclass of RealmObject 
{ 
    Realm realm = Realm.getDefaultInstance(); 
    realm.beginTransaction(); 
    XyzsubclassofRealmObject databaseObject = realm.copyToRealmOrUpdate(object); 
    //notice this copyToRealmOrUpdate method provides by Realm 
    realm.commitTransaction(); 
    XyzsubclassofRealmObject copyObject = clone(databaseObject);   
    return copyObject; 
} 

3) 이제도가 RealmObject의

  • 서브 클래스는 기본 getter 및 setter 메소드를 가지고 우리의 다른 논리를 원하는 경우 정적 메서드를 허용 언급 한 두 가지 포인트가 있습니다. 하나님 께 감사 드리며 정적 방법을 허용합니다. :)

  • 인터페이스없이 구현할 수 있습니다. :(

내가 copyToRealmOrUpdate에서 반환 된 databaseObject를 복제의 생각했다. 어떤 방법으로 인터페이스 (즉, 2 점)을 허용하기 때문에, 1 점은 날 도와왔다.대신에 다음과 같이 직접 복제 방법을 호출하는 I 데이터베이스 작업을 수행하는 대신 특정 모델에 일반적인 래퍼를 쓴

public static XyzsubclassofRealmObject clone(XyzsubclassRealmObject databaseObject) 
{ 
     XyzsubclassOfRealmObject obj = new XyzsubclassofRealmObject(); 
     obj.setXyz(databaseObject.getXyz()); 
     return obj; 
} 

, 나는 clone 메소드를 호출하는 반사 방법을 사용했다. 자신 만의 방법을 자유롭게 선택할 수 있습니다.

그게 전부입니다. 너 끝났어. 보시다시피, 우리는 데이터베이스 객체 대신에 복사 된 객체를 돌려 주며, 당신은 임의의 스레드에서 자유롭게 사용할 수 있습니다. :)

결론 : 많은 블로그와 게시물에서 트랜잭션 수행 중에 UI 스레드에서 사용하는 것이 성능면에서 훨씬 빠르다고합니다. 그러나 선택은 당신에 달려 있습니다. 애플리케이션 사용량이 증가 할 때까지 데이터베이스에서 얼마나 많은 데이터가 출입하는지 미리 알지 못합니다. 해당 트랜잭션이 UI를 느리게 만들 수있는 충분한 데이터를 가지면 그렇게됩니다. 또한 우리는 모든 개발자가 UI 스레드 대신 데이터베이스 스레드와 네트워크 작업을 수행하여 UI 상호 작용을 중단시키지 않도록 연습합니다.

독서의 과정과 디스크에 기록하는 것은 더 많은 시간

관련 문제