StatusLine à zero dans un Service arrière plan
Résolu
Joker_
Messages postés
172
Date d'inscription
Statut
Membre
Dernière intervention
-
Joker_ Messages postés 172 Date d'inscription Statut Membre Dernière intervention -
Joker_ Messages postés 172 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Mon projet consiste à réaliser un service qui visite chaque dix secondes un URL Http pour mettre en ligne quelques données , pour ce faire j'ai créé une nouvelle classe nommée MyService:
Lorsque l'activité appelle le Service via la méthode:
Le toast affiche:
Service was created...puis...Service started...puis (chaque 10 s)...StatusLine 200
même si je bascule vers une autre activité ou bien si je réduit l'application le toast toujours affiche StatusLine 200...bien évidement si je consulte ma base de donnée, elle est bien m.à.j
Lorsque je ferme l'application, le toast affiche:
Service was created...puis...Service started...puis (chaque 10 s)...StatusLine 0... la base de donnée est non m.à.j
Lorsque je lance de nouveau l'application, mon service fonctionne de nouveau normalement: le toast affiche:
Service was created...puis...Service started...puis (chaque 10 s)...StatusLine 200
même si je bascule vers une autre activité ou bien si je réduit l'application le toast toujours affiche StatusLine 200...bien évidement si je consulte ma base de donnée, elle est bien m.à.j
Que je dois faire pour que mon service fonctionne normalement même si l'application est fermée?
Merci bien de me répondre cher lecteur!!!
Mon projet consiste à réaliser un service qui visite chaque dix secondes un URL Http pour mettre en ligne quelques données , pour ce faire j'ai créé une nouvelle classe nommée MyService:
public class MyService extends Service { Timer timer; TimerTask timerTask; final Handler handler = new Handler(); @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Toast.makeText(this, "Service was Created", Toast.LENGTH_LONG).show(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); startTimer(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show(); } public void startTimer() { timer = new Timer(); initializeTimerTask(); timer.schedule(timerTask, 5000, 10000); } public void stoptimertask(View v) { if (timer != null) { timer.cancel(); timer = null; } } public void initializeTimerTask() { timerTask = new TimerTask() { public void run() { handler.post(new Runnable() { public void run() { StringBuilder reponseHttp= new StringBuilder(); HttpClient client = new DefaultHttpClient(); String url="http://rawabiserv.000webhostapp.com/mysql_query_test.php"; HttpGet httpGet = new HttpGet(url); int code=0; try { HttpResponse response = client.execute(httpGet); StatusLine statusLine = response.getStatusLine(); code=statusLine.getStatusCode(); }//fin try catch(Exception e){ }//fin catch int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(getApplicationContext(), "StatusLine:"+Integer.toString(code), duration); toast.show(); } }); } }; } }
Lorsque l'activité appelle le Service via la méthode:
startService(new Intent(this, MyService.class));
Le toast affiche:
Service was created...puis...Service started...puis (chaque 10 s)...StatusLine 200
même si je bascule vers une autre activité ou bien si je réduit l'application le toast toujours affiche StatusLine 200...bien évidement si je consulte ma base de donnée, elle est bien m.à.j
Lorsque je ferme l'application, le toast affiche:
Service was created...puis...Service started...puis (chaque 10 s)...StatusLine 0... la base de donnée est non m.à.j
Lorsque je lance de nouveau l'application, mon service fonctionne de nouveau normalement: le toast affiche:
Service was created...puis...Service started...puis (chaque 10 s)...StatusLine 200
même si je bascule vers une autre activité ou bien si je réduit l'application le toast toujours affiche StatusLine 200...bien évidement si je consulte ma base de donnée, elle est bien m.à.j
Que je dois faire pour que mon service fonctionne normalement même si l'application est fermée?
Merci bien de me répondre cher lecteur!!!
A voir également:
- StatusLine à zero dans un Service arrière plan
- Remettre a zero un pc - Guide
- Arrière plan - Guide
- Youtube en arrière plan - Guide
- Arriere plan pc - Guide
- Service spouleur - Guide
5 réponses
Hello,
Plus d'infos ici : https://developer.android.com/guide/components/services
Plus d'infos ici : https://developer.android.com/guide/components/services
Joker_
Messages postés
172
Date d'inscription
Statut
Membre
Dernière intervention
1
Merci BunoCs pour la réponse mais si vous regardez de nouveau mon sujet j'ai bien réussit à démarrer mon service et lui même a démarré une boucle infinit (chq 10 sec visiter un URL) mais le problème que le client httpresponse n'a pas réussit à visiter mon URL si mon application est fermée.
Joker_
Messages postés
172
Date d'inscription
Statut
Membre
Dernière intervention
1
Désolé en faite et plus précisément ce qu'il me paraît sue HttpClient client n'a pas reussit d'executer bien ma requete a travers le variable HttpGet httpGet parce que ce client retourne statusLine avec un code 0
Lorsque je ferme l'application, le toast affiche:Est-ce que tu ne feras pas un
Service was created...puis...Service started...puis (chaque 10 s)...StatusLine 0... la base de donnée est non m.à.j
stopService()quelque part ?
J'ai beaucoup chercher dans les forums pour comprendre mon problème!! J'ai trouvé qu'il faut mieux executer les taches de HttpClient dans un autre thread, il faut utiliser AsyncTask alors j'ai appelé AsyncTask à partir de mon service
le code de ma classe MyAsync:
mais le problème persiste encore: si l'application fermée le HttpClient ne peut pas accéder au site et avec le lancement d'une exception : android.os.NetworkOnMainThreadException
public void initializeTimerTask() { timerTask = new TimerTask() { public void run() { handler.post(new Runnable() { public void run() { MyAsync myTask = new MyAsync(getApplicationContext()); myTask.execute("http://rawabiserv.000webhostapp.com/mysql_query_test.php"); } }); } }; }
le code de ma classe MyAsync:
public class MyAsync extends AsyncTask { private Context mContext; Timer timer; TimerTask timerTask; final Handler handler = new Handler(); public void startTimer() { timer = new Timer(); initializeTimerTask(); timer.schedule(timerTask, 5000, 10000); } public void stoptimertask(View v) { if (timer != null) { timer.cancel(); timer = null; } } public void initializeTimerTask() { timerTask = new TimerTask() { public void run() { handler.post(new Runnable() { public void run() { HttpClient client = new DefaultHttpClient(); String url="http://rawabiserv.000webhostapp.com/mysql_query_test.php"; HttpPost httpPost = new HttpPost(url); int code=-1; try { HttpResponse response = client.execute(httpPost); StatusLine statusLine = response.getStatusLine(); code=statusLine.getStatusCode(); }//fin try catch(Exception e){ int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(mContext, "Exception:"+e.toString(), duration); toast.show(); }//fin catch int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(mContext, "StatusLine:"+Integer.toString(code), duration); toast.show(); } }); } }; } public MyAsync(Context context) { mContext = context.getApplicationContext(); } @Override protected Object doInBackground(Object[] objects) { startTimer(); return null; } @Override protected void onPreExecute() { } protected Integer doInBackground(String... params) { startTimer(); return 1; } protected void onPostExecute(Integer integer) { //Print the response code as toast popup Toast.makeText(mContext, "Response code: " + integer, Toast.LENGTH_LONG).show(); } }
mais le problème persiste encore: si l'application fermée le HttpClient ne peut pas accéder au site et avec le lancement d'une exception : android.os.NetworkOnMainThreadException
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question