StatusLine à zero dans un Service arrière plan
Résolu
Joker_
Messages postés
190
Statut
Membre
-
Joker_ Messages postés 190 Statut Membre -
Joker_ Messages postés 190 Statut Membre -
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!!!
5 réponses
-
-
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.à.jstopService()
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
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 -
C'est résolut: j'ai ajouté ces deux lignes avant que je manipule leHttpClient
StrictMode.ThreadPolicy threadPolicy=new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(threadPolicy);