2011-11-11 3 views
1

콘텐츠 리졸버를 사용하여 콘텐츠 공급자로부터 데이터를 가져 오려고합니다. 스레드에서이 작업을 수행하고 새 데이터 (매 5 초마다)를 계속 쿼리하려고합니다.ContentResolver 쿼리 함수 블록

public void run() 
{ 
    while (!this.cancelled) 
    { 
    // get the cursor to all the msgs 
    Cursor cur = this.mContentResolver.query(MY_URI, null, null, null, null); 

    .... // iterate through cursor, store some data, etc. (quick process) 

    // sleep the thread for a bit before we query again 
    try 
    { 
     Thread.sleep(5000); // sleep for 5 seconds 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
} 

(실행 방법은 내 기본 UI 스레드에서 실행 한 내 스레드의 일부입니다.)

처음 쿼리를 실행하면 상당한 시간 (어쩌면 몇 밀리 초) 동안 차단되지 않는 것처럼 보입니다. 정상적인 작동처럼 보입니다. 이후의 모든 쿼리가 호출되고 정확히 30 초 동안 차단됩니다.

왜 처음에는 즉시 실행되고 이후의 모든 시간에는 30 초 동안 차단되는지 알 수 없습니다.

내가이 동작을하는 이유는 무엇일까?

감사

편집 : 30 초 새를 해제하기 전에 커서를 정리하는 컨텐츠 공급자가 기다리고 있었다, 이유를 발견.

+0

먼저, 다른 URI를 사용하려고합니다. 문제가 계속되면 코드에서 문제가 될 수 있습니다. 문제가 해결되지 않으면 해당 특정 콘텐츠 공급자의 특정 동작입니다. – inazaruk

+1

콘텐츠 옵저버를 사용합니다. 변경 사항을 폴링하지 마십시오. – CommonsWare

+0

콘텐츠 관찰자를 살펴 보겠습니다. 콘텐츠 옵저버 사용 방법에 대한 좋은 자습서 링크가 있습니까? – harbinja

답변

0

"sleeping"은 무한 루프를 반복하지 않고 Thread.sleep()을 호출하는 대신 TimerTask을 사용하여 구현해야합니다.

에 Thread.sleep()는 매우 추하고 대개 문제에서 당신을 얻을 수 ...

관련 문제