サーバーから10秒ごとにステータスを受け取る必要があります。
サービス経由でhttpリクエストを送信してみました。
問題は、私のコードが1回しか実行されないことです。
これは私のサービスのコードです:
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);
}
}
}
たくさんのAviに感謝します
OnPostExecute内にハンドラーを配置して、10秒後にhttpリクエストを送信します
new Handler().postDelayed(new Runnable() {
public void run() {
requestHttp();
}
}, 10000);
10秒後、doInBackgroundが再度実行され、その後onPostExecuteが再度実行され、ハンドラーが再度実行されます。
AndroidではCountDownTimer
クラスを使用するだけです。
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
}
}
それがあなたを助けることを願っています。
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);
コードが1回だけ実行される理由は、タイマーループにreturn
があるためです。ただし、ループをバックグラウンドタスクに移動するか、ここに示す他の回答の1つを使用することをお勧めします。これは、決して戻らないonStartCommand()
でループを実装するのではありません。
リターンSTART_STICKYを置きます。しばらくすると、サービスは正常に機能します