2011-11-11 58 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線程啓動的線程的一部分)。

第一次執行查詢時,它似乎不會阻塞任何大量的時間(可能是幾ms),這對我來說似乎是正常操作。隨後的每個時間查詢都會被調用,它會阻塞整整30秒。

我不知道爲什麼它會立即執行第一次,然後每隔30秒阻塞一次。

任何人都可以說出爲什麼我可能會看到這種行爲?

感謝

編輯:找到原因,內容提供商在等待30秒,以釋放一個新的前清理光標。

+0

首先,請嘗試使用其他URI。如果問題仍然存在,則可能是代碼中的問題,如果問題消失,那麼這是特定內容提供者的特定行爲。 – inazaruk

+1

使用內容觀察者;不要調查變化 – CommonsWare

+0

我會看看內容觀察員。你有一個關於如何使用內容觀察者的好教程的鏈接嗎? – harbinja

回答

0

您應該使用TimerTask來實現「睡眠」,而不是無限循環並調用Thread.sleep()。

Thread.sleep()方法是非常,非常醜陋和通常只會使你陷入麻煩..