2011-11-11 25 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()方法是非常,非常丑陋和通常只会使你陷入麻烦..