Android:如何通过服务每10秒发送一次HTTP请求

11

我需要每隔10秒从服务器接收一次状态。

我尝试通过服务发送http请求来实现这一点。

问题在于我的代码只执行一次。

以下是我的服务代码:

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

5个回答

19

在onPostExecute中放置一个处理程序,在10秒后发送一个HTTP请求。

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

在10秒后,doInBackground将再次执行,然后是onPostExecute、处理程序等循环执行。


1
非常感谢。做到了。 - אVי

1
你可以在安卓中简单地使用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
    }
}

希望它能对你有所帮助。

在onFinish()方法中,您可以向任何类发送广播消息,该类将调用Web服务或执行某些操作并更新数据。这取决于您的要求,您可以自行决定如何实现它。 :-) - Rushabh Patel

0
代码只运行一次的原因是你的计时器循环中有一个return。然而,我建议将循环移到后台任务中或使用这里提供的其他答案之一,而不是在onStartCommand()中实现永远不返回的循环。

0
在 while 后面加上 return START_STICKY;,服务就能正常工作了。

你能更具体地说明这将会做什么,以及它对应用程序的影响吗? - JamesENL

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接