2013-10-27 5 views
7

Ich brauche alle 10 Sekunden einen Status vom Server erhalten.Android: Wie HTTP-Anfrage über den Dienst alle 10 Sekunden senden

Ich habe versucht, dies zu tun, indem Sie eine HTTP-Anfrage über Service senden.

Das Problem ist, dass mein Code nur einmal ausgeführt wird.

Dies ist der Code für meinen Dienst:

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

alot des Thank Avi

Antwort

15

Setzen Sie einen Handler innerhalb OnPostExecute eine HTTP-Anfrage nach 10 Sekunden doInBackground wieder

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

Nach 10 Sekunden senden ausgeführt wird, danach OnPostExecute wieder Handler wieder und so weiter und so weiter ..

+0

Vielen Dank DAS hat es getan. –

1

Sie einfach CountDownTimer Klasse in Android verwenden können.

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 
    } 
} 

Ich hoffe, es wird Ihnen helfen.

+0

onFinish() können Sie Broadcast-Nachricht an jede Klasse senden, die Web-Service aufrufen oder ein paar Sachen und aktualisieren Sie die Daten .. Es ist Ihre Anforderung, wie Sie es erreichen wollen . :-) –

0

Der Grund, warum der Code nur einmal ausgeführt wird, ist, dass in der Timer-Schleife ein return steht. Ich würde jedoch empfehlen, die Schleife zu Ihrer Hintergrundaufgabe zu verschieben oder eine der anderen hier angegebenen Antworten zu verwenden, anstatt eine Schleife in onStartCommand() zu implementieren, die nie zurückkehrt.

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

Rückgabe START_STICKY; nach, während und Service wird einwandfrei funktionieren

+0

Können Sie genauer bestimmen, was dies tun wird und welche Auswirkungen es auf die Anwendung haben wird. – JamesENL

Verwandte Themen