2012-01-20 2 views
3

私のアプリケーションは(アプリケーションがフォアグラウンドでない場合でも)10分ごとにデータにアクセスするためにWebサービスにアクセスします。それをする最善の方法は何ですか?別のスレッドでサービスを実行し、10分ごとにそれを起動しますか?

まず、seaparateスレッドでサービスを開始する必要がありますか? 10分ごとにサーバーから更新を取得するにはどうすればいいですか? handle.postdelayedとAlarm Managerを使用している人もいます。どちらが良いか、いくつかの例があります。

答えて

3

アプリケーションの実行中に更新が発生する場合は、あなたが他の回答で示唆されているように、タイマーを使用するか、またはScheduledThreadPoolExecutor新しいことができます。
アプリケーションが実行されていない場合でも、更新する場合は、あなたがAlarmManagerに行くべきは:

アラームマネージャを使用すると、特定の時間にご アプリケーションコードの実行を持つようにしたい場合のために意図されて、でもあなたのアプリケーションが現在実行されていない場合は です。

、あなたのアプリケーションをオフにすると、更新を予定している場合ことをメモします、一回10分ごとにかなり頻繁にあるので、おそらく少しもパワーを消費。

+0

ありがとう..あなたはこれのためにいくつかの例をオンラインで知っています..それは素晴らしいだろう.. – carora3

+1

それではAlarmManagerの上でhttp://stackoverflow.com/questions/1082437/android-alarmmanager 公式のScheduledExecutor Java-docsの例を示します。http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html – Jave

0

java.util.TimerまたはScheduledThreadPoolExecutor(推奨)を使用して、バックグラウンドスレッドで一定の間隔でアクションが発生するようにスケジュールできます。

は、ここで後者を使用したサンプルです:だけでなく、実際に私はまったく同じケースにTimerを使用

ScheduledExecutorService scheduler = 
    Executors.newSingleThreadScheduledExecutor(); 

scheduler.scheduleAtFixedRate 
     (new Runnable() { 
     public void run() { 
      // call service 
     } 
     }, 0, 10, TimeUnit.MINUTES); 
+0

['TimeUnit.MINUTES'はAndroidに存在しないことがあります。](http://stackoverflow.com/questions/3472423/android-java-util-concurrent-timeunit-convert-milliseconds-to-minutes) –

0

、それが私のために動作します。

timer = new Timer(); 

    timer.scheduleAtFixedRate(new TimerTask() { 

     synchronized public void run() { 

      \\ here your todo; 
      } 

     }}, 60000, 60000); 
+0

Timerには、ScheduledThreadPoolExecutorによって解決されるいくつかの欠点があります。それは最高の選択ではありません – Alexandr

1

ジェフリー・シャーキーは、あなたのトピックに関するベストプラクティスへの良い導入を与えるべきであるスライド21

から注視し、Google IO 2009で話題に優れたプレゼンテーションを持っていました。

抜粋:ハンドラまたはタイマーを使用しないでください。AlarmManagerおよびsetInexactRepeating(..)を参照してください。

関連する問題