2013-10-27 20 views
7

10秒ごとにサーバーからステータスを受け取る必要があります。Android:サービスから10秒ごとにhttpリクエストを送信する方法

サービスからhttpリクエストを送信することでこれを実行しようとしました。

問題は、自分のコードが1回だけ実行されることです。

これは私のサービスのためのコードです:あなたは単にアンドロイドでCountDownTimerクラスを使用することができます

public class ServiceStatusUpdate extends Service { 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    while(true) 
    { 
     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException e) { 
      new DoBackgroundTask().execute(Utilities.QUERYstatus); 
      e.printStackTrace(); 
     } 
     return START_STICKY;    
    } 
} 

private class DoBackgroundTask extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     String response = ""; 
     String dataToSend = params[0]; 
     Log.i("FROM STATS SERVICE DoBackgroundTask", dataToSend); 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(Utilities.AGENT_URL); 

     try { 
      httpPost.setEntity(new StringEntity(dataToSend, "UTF-8")); 

      // Set up the header types needed to properly transfer JSON 
      httpPost.setHeader("Content-Type", "application/json"); 
      httpPost.setHeader("Accept-Encoding", "application/json"); 
      httpPost.setHeader("Accept-Language", "en-US"); 

      // Execute POST 
      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity responseEntity = httpResponse.getEntity(); 
      if (responseEntity != null) { 
       response = EntityUtils.toString(responseEntity); 
      } else { 
       response = "{\"NO DATA:\"NO DATA\"}"; 
      } 
     } catch (ClientProtocolException e) { 
      response = "{\"ERROR\":" + e.getMessage().toString() + "}"; 
     } catch (IOException e) { 
      response = "{\"ERROR\":" + e.getMessage().toString() + "}"; 
     } 
     return response; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     Utilities.STATUS = result; 
     Log.i("FROM STATUS SERVICE: STATUS IS:", Utilities.STATUS); 
     super.onPostExecute(result); 
    } 
} 
} 

感謝のたくさん アビ

答えて

15

それが再びonPostExecute後ハンドラ再びなどなど...

、doInBackgroundが再び実行される10秒後10秒

new Handler().postDelayed(new Runnable() { 
     public void run() { 
      requestHttp(); 
     } 
    }, 10000); 

後にHTTPリクエストを送信するためにonPostExecute内部ハンドラを入れて

+0

ありがとうございました ThATしました。 –

1

public class AlertSessionCountDownTimer extends CountDownTimer { 

    public AlertSessionCountDownTimer(long startTime, long interval) { 
     super(startTime, interval); 
    } 

    @Override 
    public void onFinish() { 
     //YOUR LOGIC ON FINISH 10 SECONDS 
    } 

    @Override 
    public void onTick(long millisUntilFinished) { 
     //YOUR LOGIC ON TICK 
    } 
} 

ご希望の場合はお手数ですが、

+0

onFinish()Webサービスを呼び出すクラスにブロードキャストメッセージを送信したり、データを更新したりすることができます。 。 :-) –

0

コードが1回だけ実行される理由は、タイマーループにreturnがあるということです。しかし、私はあなたのバックグラウンドタスクにループを移動するか、決して返さないonStartCommand()にループを実装するのではなく、ここで与えられた他の答えの1つを使用することをお勧めします。

0
Handler handler_proc = new Handler(); 

final Runnable runnable_proc = new Runnable() { 
    public void run() { 
     requestHttp(new OnFinish() { 
      @Override 
      public void onSuccess() { 
       // pause should be considered since the end of the previous http request. 
       // Otherwise, new requests will occur before the previous one is complete, 
       // if http_timeout > delay 
       handler_proc.postDelayed(runnable_proc, 10000); 
      } 
     }); 
    } 
} 

handler_proc.post(runnable_proc); 
0

put return START_STICKY; その後、サービスは正常に動作します

+0

これが何をするのか、それがアプリケーションに及ぼす影響について、より具体的に説明できますか? – JamesENL

関連する問題