TP5 onSaveInstanceState

Modérateurs : Douin, F. Lemoine, Farinone

Répondre
Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

TP5 onSaveInstanceState

Message par Delot » 19 mars 2017 19:25

Bonjour,

Je suis bloqué à la question 1, j'arrive bien à afficher les numéros mais lorsque je sors de l'application, j'ai le message d'erreur "TP5 has stopped" ou "TP5 keeps stopping" je pense que c'est un problème avec la méthode onSaveInstanceState.

Si je l'écris comme dans l'exemple, j'ai un message d'erreur :

public void onSaveInstanceState(Bundle outState) {
if(I)Log.i(TAG, "onSaveInstanceState");
outState.putSerializable("ticker", ticker);
}

Alors qu'il fonctionne bien si je l'écris comme ça :

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}

Merci pour vos réponses.

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

Re: TP5 onSaveInstanceState

Message par khris » 20 mars 2017 11:40

Salut,
J'ai aussi le même message d'erreur.

Je pense que le problème vient de l'attribut Context de la classe Ticker.
La classe Ticker est Serializable.
Or le contexte n'est pas Serializable.

Du coup, quand on cherche à sauvegarder le Ticker avec output.putSerializable(ticker) dans le onSaveInstanceState(), Android plante parce qu'il ne peut pas sérialiser le contexte.

Je n'ai pas encore trouvé de solution à ce problème, j'y travaille. :-p

Douin
Messages : 202
Inscription : 18 mars 2009 15:46

Re: TP5 onSaveInstanceState

Message par Douin » 20 mars 2017 14:59

Bonjour,

Curieux, je vérifie avec la solution, demain matin...

Bonne sérialisation

Douin
Messages : 202
Inscription : 18 mars 2009 15:46

Re: TP5 onSaveInstanceState

Message par Douin » 20 mars 2017 15:11

Une solution de rechange si c'est bien le context qui est en cause

Déclarer l'attribut transient : private transient Context context;

Ajoutez un mutateur à la classe Ticker setContext(Context context){ this.context = context; }

à la restitution
ticker = (Ticker)outState.getSerializable("ticker");
ticker.setContext(this);

Dites moi si l'exécution est plus conciliante

à suivre...

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

Re: TP5 onSaveInstanceState

Message par khris » 20 mars 2017 21:03

Merci,
ça m'a débloqué :)

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP5 onSaveInstanceState

Message par Delot » 21 mars 2017 0:18

Je suis toujours bloqué avec les même message d'erreur.
Si ça fonctionne pour toi c'est que je dois avoir une autre erreur ailleurs.
Merci pour vos réponses.

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

Re: TP5 onSaveInstanceState

Message par khris » 21 mars 2017 0:38

Peux-tu coller ici ton message d'erreur et tes méthodes onSaveInstanceState() & onRestoreInstanceState() ?

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP5 onSaveInstanceState

Message par Delot » 21 mars 2017 1:19

public void onSaveInstanceState(Bundle outState) {
if (I) Log.i(TAG, "onSaveInstanceState");
outState.putSerializable("ticker", ticker);
}

public void onRestoreInstanceState(Bundle outState) {
if (I) Log.i(TAG, "onRestoreInstanceState");
ticker = (Ticker) outState.getSerializable("ticker");
ticker.setContext(this);
}

Le message d'erreur quand le compteur est lancé :
TP5 keeps stopping
Le message d'erreur quand le compteur ne tourne pas :
TP5 has stopped

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

Re: TP5 onSaveInstanceState

Message par khris » 21 mars 2017 1:39

Je parlais du message d'exception. :-p

Au début de ton onSaveInstanceState(), ajoute un appel à super.onSaveInstanceState(outState);
Et au début de ton onRestoreInstanceState(), ajoute un appel à super.onRestoreInstanceState(outState);

Je pense que ça devrait régler ton problème ^^

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP5 onSaveInstanceState

Message par Delot » 21 mars 2017 12:50

Toujours pas, même avec :
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (I) Log.i(TAG, "onSaveInstanceState");
outState.putSerializable("ticker", ticker);
}

@Override
public void onRestoreInstanceState(Bundle outState) {
super.onRestoreInstanceState(outState);
if (I) Log.i(TAG, "onRestoreInstanceState");
ticker = (Ticker) outState.getSerializable("ticker");
ticker.setContext(this);
}
J'ai l'erreur suivante :
FATAL EXCEPTION: main
Process: smb116.cnam.tp5, PID: 10968
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = smb116.cnam.tp5.MainActivity$Ticker)

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

Re: TP5 onSaveInstanceState

Message par khris » 21 mars 2017 13:16

Ok, Android essaie de sérialiser Ticker.
Peux-tu coller ici ta classe Ticker ?

De ce que je comprends, Ticker semble implémenter Parcelable et non Serializable.

Donc, pour la question 1, Ticker doit implémenter Serializable et non Parcelable.
Pense aussi à mettre l'attribut Context (toujours dans la classe Ticker) en transcient comme indiqué par Mr Douin.

Pour la question 3, Ticker doit implémenter Parcelable.
Il faudra donc mettre à jour les méthodes onSaveInstanceState() & onRestoreInstanceState() de sorte qu'elles gèrent les Parcelables et non plus les Serializable.

Dans onSaveInstanceState, il faut donc remplacer la ligne
outState.putSerializable("ticker", ticker);
par
outState.putParcelable"ticker", ticker);

Et dans onRestoreInstanceState(), il faut remplacer la ligne
ticker = (Ticker) outState.getSerializable("ticker");
par
ticker = outState.getParcelable("ticker");

Dis-moi si ça t'a dépanné

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP5 onSaveInstanceState

Message par Delot » 21 mars 2017 13:29

Ma classe Ticker implémente bien Serializable :

private class Ticker extends Thread implements Serializable {
public static final String TIME_ACTION_TIC = "time_action_tic";
public static final String COUNT_EXTRA = "count";

private transient Context context;

public Ticker(Context context) {
this.context = context;
}

public void startTicker() {
this.start();
}

public void stopTicker() {
this.interrupt();
}

public void run() {
Intent intent = new Intent();
intent.setAction(TIME_ACTION_TIC);
while (!isInterrupted()) {
SystemClock.sleep(1000L);
count++;
intent.putExtra(Ticker.COUNT_EXTRA, count);
if (count <= 10)
context.sendBroadcast(intent);
else
context.sendOrderedBroadcast(intent, null);
}
}

public void setContext(MainActivity context) {
this.context = context;
}
}

et onSaveInstanceState et onRestoreInstanceState utilisent bien outState.putSerializable et outState.getSerializable
Je ne sais pas pourquoi le message d'erreur me marque un problème avec Parcelable alors que je ne l'utilise pas encore

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

Re: TP5 onSaveInstanceState

Message par khris » 21 mars 2017 15:19

J'avoue que je sèche là :/
Tu as essayé de cleaner ton projet, de désinstaller l'app de ton tèl et de tout relancer ?

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP5 onSaveInstanceState

Message par Delot » 21 mars 2017 16:28

J'ai essayé de changer de tel et de cleaner le projet mais ça ne change rien, tempi.
Merci quand même pour ton aide ;)

Répondre

Qui est en ligne ?

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