PB cours Service_Recever Part IntentService

Modérateurs : Douin, F. Lemoine, Farinone

LudovicF
Messages : 29
Inscription : 20 févr. 2017 15:45

PB cours Service_Recever Part IntentService

Message par LudovicF » 12 avr. 2017 12:21

Bonjour,

J'essaie de reproduire la partie IntentService mais j'ai des erreur en suivant les information du cours voir image ci-dessous :

Image

J'imagine que pour le interrupt() c'est ticker.interrupt() mais pour le this je ne sais pas ...

Le code du TimeIntentService

Code : Tout sélectionner

package cnam.smb116.tp8_intentservice;

import android.app.IntentService;
import android.content.Intent;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;

import java.util.concurrent.atomic.AtomicLong;

/**
 * An {@link IntentService} subclass for handling asynchronous task requests in
 * a service on a separate handler thread.
 * <p>
 * TODO: Customize class - update intent actions, extra parameters and static
 * helper methods.
 */
public class TimeIntentService extends IntentService {

    public TimeIntentService(){
        super("TimeIntentService");
        Log.i("TimeIntentService", "TimeIntentService");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        TimeIntentService.count = new AtomicLong(0);
        Log.i("TimeIntentService", "onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("TimeIntentService", "onDestroy");
    }

    private static Thread ticker;
    private static AtomicLong count;

    // l’horloge et son thread, « du classique »
    private class Ticker implements Runnable {
        public void run() {
            while (!ticker.isInterrupted()) {
                try {
                    Thread.sleep(1000);
                    count.set(count.longValue() + 1L);
                    Log.i("TimeIntentService.t", "count: " + count.get());
                } catch (Exception e) {
                    return;
                }
            }
        }
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();

        if (intent != null) {
            //final String action = intent.getAction();
            boolean interrupted = extras.getBoolean("interrupted");
            if (interrupted) {
                interrupt();
            } else {
                if (ticker == null) {
                    ticker = new Thread(this);
                    ticker.start();
                }
                Log.i("TimeIntentService", "onHandleIntent");

            }
        }
    }

}

khris
Messages : 28
Inscription : 25 mars 2014 18:10
Contact :

Re: PB cours Service_Recever Part IntentService

Message par khris » 12 avr. 2017 14:39

Hello,
Alors dans l'ordre :
Pour le interrupt, la solution est effectivement d'écrire :

Code : Tout sélectionner

ticker.interrupt()
Pour l'instanciation du ticker, il faut retirer le this.
En effet, l'attribut ticker n'est pas de type Ticker mais de type Thread c'est ce qui a du t'induire en erreur :p
Lors de son instanciation tu passes en paramètre ta classe TimeIntentService ce qui n'a pas de sens pour Java.
Un Thread peut accepter en paramètre un Runnable lors de l'instanciation
Ça tombe bien ta classe Ticker implémente Runnable :)

Tu peux donc écrire :

Code : Tout sélectionner

ticker = new Thread(new Ticker());

LudovicF
Messages : 29
Inscription : 20 févr. 2017 15:45

Re: PB cours Service_Recever Part IntentService

Message par LudovicF » 12 avr. 2017 16:16

Merci beaucoup pour ta réponse khris :-)

Mais j'ai une maintenant une erreur en cliquant sur le bouton Start

Code : Tout sélectionner

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Bundle.getBoolean(java.lang.String)' on a null object reference
 at cnam.smb116.tp8_intentservice.TimeIntentService.onHandleIntent(TimeIntentService.java:62)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:68)
Image

Ça devient compliqué pour moi, car si je ne sais pas appliqué les exemples du cours du 4 avril, je ne peux pas avancé sur le TP8, si je ne maitrise pas cette partie, je ne sais pas si je peux appliquer les exemple du cours du 11 avril et donc j'ai peur de ne pas arriver à réaliser le TP9 :-/

khris
Messages : 28
Inscription : 25 mars 2014 18:10
Contact :

Re: PB cours Service_Recever Part IntentService

Message par khris » 12 avr. 2017 17:56

Il semblerait que ton Intent n'ait pas d'extra correspondant à la clé "interrupted".
As-tu bien orthographié la clé ?
As-tu fait un intent.putExtra("interrupted", tonBooleen); ?
Si oui, je suppose que la définition de l'extra se passe dans la MainActivity.
Peux-tu coller le code de ta MainActivity ici ?

LudovicF
Messages : 29
Inscription : 20 févr. 2017 15:45

Re: PB cours Service_Recever Part IntentService

Message par LudovicF » 13 avr. 2017 10:15

Oui, voici mon le code du MainActivity

Code : Tout sélectionner

package cnam.smb116.tp8_intentservice;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private boolean started;
    private TimeService timeService;

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.i("MainActivity", "onServiceConnected");
            timeService = ((TimeService.LocalBinder) iBinder).getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i("MainActivity", "onServiceDisconnected");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
    }

    public void onPause(){
        super.onPause();
        //if(started) stopService(new Intent(this, TimeService.class));
    }

    public void onClickStart(View v){
        Intent intent = new Intent(this, TimeIntentService.class);
        //bindService(intent, connection, Context.BIND_AUTO_CREATE);
        //started = startService(intent) != null;
        started = startService(intent) != null;
    }

    public void onClickStop(View v){

        started = stopService(new Intent(this, TimeIntentService.class));
        //unbindService(connection);

    }

    public void onClickGet(View v){
        TextView tv = (TextView) findViewById(R.id.sortieId);
        if(timeService != null){


        tv.setText(Long.toString(timeService.getCount()));
        }
    }
}

khris
Messages : 28
Inscription : 25 mars 2014 18:10
Contact :

Re: PB cours Service_Recever Part IntentService

Message par khris » 13 avr. 2017 15:02

À aucun moment tu ne définis dans l'intent le booléen indiquant qu'il y a une interruption.
Je pense qu'il faut ajouter ce booléen dans les méthodes onClickStart et onClickStop de ta MainActivity de sorte à avoir :

Code : Tout sélectionner

public void onClickStart(View v){
    Intent intent = new Intent(this, TimeIntentService.class);
    intent.putExtra("interrupted", false);
    started = startService(intent) != null;
}

public void onClickStop(View v){
    Intent intent = new Intent(this, TimeIntentService.class);
    intent.putExtra("interrupted", true);
    started = stopService(intent);
}
De plus, Attention au lancement du ticker dans ton IntentService.
Tu sembles avoir oublié d'inclure une nouvelle instance de la classe Ticker dans l'instanciation du Thread ticker (je te conseille de renommer l'attribut ticker en tickerThread pour t'y retrouver :p )
Du coup la méthode onHandleIntent de ton TimerIntentService devrait ressembler à ça

Code : Tout sélectionner

@Override
protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();

    if (intent != null) {
        boolean interrupted = extras.getBoolean("interrupted");
        if (interrupted) {
            ticker.interrupt();
        } else {
            if (ticker == null) {
                ticker = new Thread(new Ticker());
                ticker.start();
            }
            Log.i("TimeIntentService", "onHandleIntent");

        }
    }
}
Dis-moi si ça t'a débloqué :)

LudovicF
Messages : 29
Inscription : 20 févr. 2017 15:45

Re: PB cours Service_Recever Part IntentService

Message par LudovicF » 14 avr. 2017 10:01

Bonjour,

Super, ça fonctionne :-)

Image

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité