2011-11-11 2 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(); 
    } 
    } 
} 

(runメソッドは、メインUIスレッドから起動したスレッドの一部です)。

クエリが初めて実行されたとき、通常の操作のように思えるほどの時間(多分数ミリ秒)はブロックされません。それ以降の時間問合せが呼び出されると、それは正確に30秒間ブロックされます。

なぜ最初にすぐに実行されるのかわかりません。その後、毎回30秒間ブロックします。

誰も私がこの動作を見ている理由についていくつかの光を当てることができますか?

おかげ

EDIT:30秒は、新しいものをリリースする前にカーソルをクリーンアップするための理由が見つかりましたが、コンテンツプロバイダが待っていました。

+0

まず、別のURIを使用してみてくださいです。問題が解決しない場合は、特定のコンテンツプロバイダの特定の動作です。 – inazaruk

+1

コンテンツオブザーバを使用します。変更をポーリングしない – CommonsWare

+0

コンテンツオブザーバを調べます。コンテンツオブザーバーの使い方に関する良いチュートリアルへのリンクがありますか? – harbinja

答えて

0

無限にループしてThread.sleep()を呼び出す代わりに、TimerTaskを使用して確実に "スリープ"を実装する必要があります。

のThread.sleep()は非常に、非常に醜いと通常はトラブルにあなたを取得...

関連する問題