2011-02-02 31 views
1

私は自分のコードでバックグラウンドスレッドの一部としてforループを持っています。ループ内でのコード実行の途中で待つ期間が必要なので、thread.sleepを呼び出します。私は、待機時間中に電話機のディスプレイが閉じると、待ち時間が不安定になることを発見しました。文書によると、睡眠は時間的に信頼できるものではありません。だから私は何を代用するのかと思っています。限り、私はポスト遅延サブスレッドを作成するかどうかは、私はループ内の連続性を失うことがわかります。私は間違っていて、メカニックを正しく理解していないことを願っています。 Ronthread.sleepの代わりになるもの

答えて

0

Handlerを使用してpostDelayedと呼ぶことはできますか?私は正直なところ、どれくらいの信頼性があるか、あなたの問題に合っていると主張することはできませんが、小さな定期的な更新にはそれを使用します。

Partial Wake Locksを参照すると、より信頼できるパフォーマンスが得られるかどうかを確認することもできます。睡眠の信頼性の欠如(に対処するための

(...) 
Message msg = new Message(); 
try { 
    myHandler.sendMessageDelayed(msg,1000); 

      } catch (Exception e) { 
       Log.d(TAG,"Hum?",e); 
      } 
     } 
    } 


    private Handler myHandler= new Handler() { 
     /* 
     * (non-Javadoc) 
     * 
     * @see android.os.Handler#handleMessage(android.os.Message) 
     */ 
     @Override 
     public void handleMessage(Message msg) { 
      //DO WHAT YOU WANT.. 
     } 
    }; 
+0

私がpostDelayedを呼び出すと、私の説明にあるようにforループコードに戻る方法は?私はちょうどPartialWakeLocksを見てきましたが、大きな警告電力が消費されています。私はできるだけ電力使用量を低く抑えたいと思っています。この睡眠状況は何度も起こる可能性があります。 – ron

+0

postDelayedを使用する背後にあるアイデアは、ループ内のものをハンドラによって呼び出される単一の作業単位にし、(現在のスリープの代わりに)再度実行されるように再ポストすることです。ウェイクロックでは、あなたは慎重でなければならず、あなたが達成しようとしていることが分からなければ、私はどちらかの方法で議論するつもりはありませんが、私はあなたに何か考えることを与えたかったのです。 –

+0

アップデート:私はもう一度考えて、今度は非常に信頼できると思われる繰り返しアラームを使用します。これはforループを必要とせず、必要なときにアラームをキャンセルすることができます。 – ron

0

あなたはこのようなものが必要。これは、アニメーションで行われることが多く、例えば、リアルタイムに追いつくためにいくつかのフレーム数をスキップすることができます。

1

一つの方法)あなたが眠っていた実際の時間を測定するためのコードを追加することです:

+0

私は何か基本的なものを見逃しているに違いありません。私は最後の日にこれについて考えていて、このコードを使いこなしてみました。たとえ私がforループを持っていてもsendMessageDelayedの中にループがあっても、ループはメッセージを送信しますが、ループの次の繰り返しに直進します。これは私が期待しているもので、実際には何が起こっているのですか?私はこの睡眠はこの必要性を満たすことを意図していると思うが、私はそれに頼ることはできない。私はスレッドとハンドラのコンセプトに何かを見逃しているに違いない。 – ron

+0

誰かが私に何かを助けてくれることを教えてくれることを願っています。私はRito Meierの本を持っていますが、それは役に立たないようです。 – ron

関連する問題