2011-06-30 20 views
51

Timerのように一定時間後に非同期タスクを繰り返し実行する方法その目的私はいくつかの固定された時間間隔後にサーバーからの更新を確認する必要があります....私は簡単にタイマーを介して行うことができますが、私はアンドロイドアプリケーションのためのより効率的だと思う非同期タスクを使用したいと思います。一定の時間間隔をおいて非同期タスクを繰り返し実行する方法

答えて

108
public void callAsynchronousTask() { 
    final Handler handler = new Handler(); 
    Timer timer = new Timer(); 
    TimerTask doAsynchronousTask = new TimerTask() {  
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() {  
        try { 
         PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask(); 
         // PerformBackgroundTask this class is the class that extends AsynchTask 
         performBackgroundTask.execute(); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 
       } 
      }); 
     } 
    }; 
    timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms 
} 
+1

多くのおかげで.... – Waseem

+3

とにかく、非同期タスクは、独自のスレッドで実行されます。なぜそれをハンドラで実行するのですか? – Siddharth

+9

はい、非同期タスクは別のスレッドで実行されますが、UIスレッド以外のスレッドからは開始できません。ハンドラは、それを可能にするためにそこにあります。 – r1k0

2

することはできだけハンドラ:

private int m_interval = 5000; // 5 seconds by default, can be changed later 
private Handle m_handler; 

@Override 
protected void onCreate(Bundle bundle) 
{ 
    ... 
    m_handler = new Handler(); 
} 

Runnable m_statusChecker = new Runnable() 
{ 
    @Override 
    public void run() { 
      updateStatus(); //this function can change value of m_interval. 
      m_handler.postDelayed(m_statusChecker, m_interval); 
    } 
} 

void startRepeatingTask() 
{ 
    m_statusChecker.run(); 
} 

void stopRepeatingTask() 
{ 
    m_handler.removeCallback(m_statusChecker); 
} 

しかし、私はこのフレームワークを確認するためにあなたをお勧めしますが:http://code.google.com/intl/de-DE/android/c2dm/は異なるアプローチです:何かが準備ができたときに、サーバーは、いくつかの帯域幅を節約、これ(電話を通知し、パフォーマンス:))

+0

おかげalot.Actually私はちょうどapplication.Server側のクライアント側はすでにiphone用に開発され、同じアプリケーションのために働いている開発していると私は、Android – Waseem

+1

に同じサーバーを使用する必要があり、私はスレッドへの新たなんですアンドロイドでハンドラにrunnableをどこに渡していますか? @DheeBに答えるには –

+2

、答えはここでは言及しませんが、このようなインスタンス化中でなければなりませんm_handler = new Handler(m_statusChecker);しかし、このハンドラ/実行可能ファイルはまだ実行中ですが、ネットワークオペレーションが "サーバから最新の未読グリーティングをすべて自動的にダウンロード"することを明示しているため、この解決策が機能しないもう一つの理由があります。まだブロックしているUIスレッドで手動で別のスレッドで起動する必要があります。 – tony9099

2

アラームマネージャを使用してサービスを作成してスケジュールする方が効率的ではありませんか?

+1

サービスを作成するのは苦痛で、サービスに気を配るのに多くのものがあります。私はちょうどタイマーを使用します。 – Siddharth

+2

サービスは簡単に開始および停止できます。さらに、それらはUIスレッドに束縛されていません。だから、私はサービスを利用するだろう。 –

+0

@IgorGanapolskyはいそうです。しかし、彼らはまた面倒で、なぜ非同期、タイマー、そして小規模な操作のためのこれらのモジュールを作成するのだろうか? – tony9099

6
//Every 10000 ms 
     private void doSomethingRepeatedly() { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 

        try{ 

        new SendToServer().execute(); 

        } 
        catch (Exception e) { 
         // TODO: handle exception 
        } 

      } 
      }, 0, 10000); 
        } 
+2

アンドロイドのドキュメントhttps://developer.android.com/reference/java/util/Timer.htmlのすべての新しいコードについては、Timer上でScheduledThreadPoolExecutorを使用することをお勧めします –

関連する問題