StatusLine à zero dans un Service arrière plan

Résolu/Fermé
Joker_ Messages postés 172 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 - Modifié le 15 oct. 2018 à 03:33
Joker_ Messages postés 172 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 - 19 oct. 2018 à 03:59
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:
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:

5 réponses

BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
15 oct. 2018 à 10:08
0
Joker_ Messages postés 172 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
15 oct. 2018 à 19:46
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.
0
Joker_ Messages postés 172 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
16 oct. 2018 à 03:53
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
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
16 oct. 2018 à 11:36
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
Est-ce que tu ne feras pas un
stopService()
quelque part ?
0
Joker_ Messages postés 172 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
16 oct. 2018 à 12:45
Non BunoC.
0
Joker_ Messages postés 172 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
18 oct. 2018 à 00:35
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
0
Joker_ Messages postés 172 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
17 oct. 2018 à 21:53
up
0
Joker_ Messages postés 172 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
18 oct. 2018 à 23:35
up
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Joker_ Messages postés 172 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
Modifié le 19 oct. 2018 à 03:59
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);
0