Rafraichir des données sous Android

Résolu/Fermé
roillion Messages postés 11 Date d'inscription mercredi 13 novembre 2013 Statut Membre Dernière intervention 6 mars 2014 - Modifié par BunoCS le 13/11/2013 à 14:02
roillion Messages postés 11 Date d'inscription mercredi 13 novembre 2013 Statut Membre Dernière intervention 6 mars 2014 - 22 nov. 2013 à 23:55
Bonjour à tous !
J'essaie de rafraichir les données d'une courbe toutes les 5 secondes.
Pour cela j'utilise un timer.
Le problème est que pour mettre à jour les données, je rappelle systématiquement l'instruction : startActivity(intent);
Ceci a pour affet de me rouvrir une nouvelle fenêtre à chaque fois et donc de faire clignoter la courbe.
Voici mon code:

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
context=this;
//Declare the timer
Timer t = new Timer();
//Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {
public void run() {
finish();
intent = chart.execute2(context);
startActivity(intent);
}
},

//Set how long before to start calling the TimerTask (in milliseconds)
5000,
//Set the amount of time between each execution (in milliseconds)
5000);
}

La fonction execute2 met à jour les données.
Quelqu'un sait donc comment rafraichir les données sans rappeler startActivity(intent); ?
Je pensais à onResume() mais je n'arrive à rien.
Merci de votre aide précieuse !!
A voir également:

9 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
14 nov. 2013 à 21:58
Ok...mais tu ne peux pas utiliser telle quelle la démo.
Le
startActivity()
te permet, comme son l'indique, de démarrer une activity, ce qui n'est pas ton cas, à moins que je ne me sois trompé depuis le départ... Toi, tu veux afficher un graphe et le mettre à jour toutes les x secondes/minutes)...
Il faut plutôt que tu te bases sur cet exemple à mon avis. Dans ton timer, "il suffit" (je mets des guillemets car je ne peux pas tester) de changer ton DataSet et d'appeler un
repaint()
sur ta vuew graph.
Apparemment, dans ce code, le graph est updaté via des boutons. Essaie d'y jeter un oeil..
1
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
13 nov. 2013 à 14:01
Hello,
Ni l'un ni l'autre.
Il te faut une méthode dédiée à la mise à jour. Celle-ci, tu pourra l'appeler dans le timer. Et le timer, tu pourras le lancer dans le
onCreate()
ou le
onResume()
en faisant bien gaffe au fait qu'
onResume()
est appelée à chaque fois que l'activity passe en foreground

Note: j'ai édité ton message pour rajouter les balises code (4e icone au-dessus de la zone de texte). Merci d'y penser la prochaine fois ;)
0
roillion Messages postés 11 Date d'inscription mercredi 13 novembre 2013 Statut Membre Dernière intervention 6 mars 2014
13 nov. 2013 à 19:00
Merci de ta réponse !

Sachant que je met à jour mes données avec execute2, j'ai testé ca mais il y a une erreur au chargement.

(avec les balises code ^^)
  public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

context=this;
startActivity(intent);

}
protected void onResume ()
{
onPause();//pour mettre l'activité en foreground
//Declare the timer
Timer t = new Timer();
//Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {
public void run() {
intent = chart.execute2(context);
}
},
//Set how long before to start calling the TimerTask (in milliseconds)
0,
//Set the amount of time between each execution (in milliseconds)
5000);
}
}

C'est ce que tu voulais dire ?
Tu sais d'où vient l'erreur ?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
Modifié par BunoCS le 14/11/2013 à 09:34
Hello,
  public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
context=this;
startActivity(intent);
}


Non, évites de faire ça! ;)
Lorsque l'activity est en train de se créer, tu en relances une autre, qui en relance une autre,... D'ailleurs,
intent
n'est pas déclaré ;)
Non, ce que je te disais c'est un truc comme ça:
  public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
context=this;
//création et lancement du timer
}


la suite non plus n'est pas bonne:
protected void onResume ()

{
onPause();//pour mettre l'activité en foreground
...
}

En règle générale, il ne faut pas appeler toi-même les méthodes onTruc(). Ce sont des callbacks appelées automatiquement.

Et enfin, ceci:
intent = chart.execute2(context);


Je ne connais pas ta méthode execute2() mais elle ne devrait pas retourner d'intent. Y'a surement un autre moyen de faire ce que tu veux

@+
Buno, Modo CS-CCM
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
The urgent is done, the impossible is underway. For miracles, envisage a time ...
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
14 nov. 2013 à 09:34
Désolé, il y a un souci actuellement avec les balises code qui rajoutent des sauts de ligne...
0

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

Posez votre question
roillion Messages postés 11 Date d'inscription mercredi 13 novembre 2013 Statut Membre Dernière intervention 6 mars 2014
14 nov. 2013 à 15:21
Bien vu pour le
intent
;)

Je le met ou du coup le
startActivity(intent);
?


Ok. On lance donc le timer, dans le
onCreate()
comme tu m'avais dit.
Par contre je met quoi dans mon timer ? Je vais pas mettre un
startActivity(intent);
sinon plusieurs fenêtre vont s'ouvrir et la courbe va clignoter.

Pour l'instant ca donne ca :



Ma fonction execute2 c'était la même que execute mais avec d'autres données pour voir si la courbe évoluait.


La fonction execute donnait les données de la courbe.
public Intent execute(Context context) {

String[] titles = new String[] { "Prix" };
long now = Math.round(new Date().getTime() / DAY) * DAY;
List<Date[]> x = new ArrayList<Date[]>();

Date[] dates = new Date[HOURS];
for (int j = 0; j < HOURS; j++) {
dates[j] = new Date(now + (TPS_ENTRE_CHAQUE_POINT * j));
}
x.add(dates);

List<double[]> values = new ArrayList<double[]>();

values.add(new double[] { 23, 24, 25, 23, 24, 21, 26, 23, 23, 25, 26,
27.8, 26, 27.5, 27, 23.2, 24, 23, 23, 23, 23, 23, 23, 23 });


int[] colors = new int[] { Color.RED};
PointStyle[] styles = new PointStyle[] { PointStyle.DIAMOND };
XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles);
int length = renderer.getSeriesRendererCount();

((XYSeriesRenderer) renderer.getSeriesRendererAt(0)).setFillPoints(true);

setChartSettings(renderer, "Matz Hermann", "Heure", "Prix",
x.get(0)[0].getTime(), x.get(0)[HOURS - 1].getTime(), 22, 29, Color.LTGRAY, Color.LTGRAY);
renderer.setXLabels(10);
renderer.setYLabels(10);
renderer.setShowGrid(true);
renderer.setXLabelsAlign(Align.CENTER);
renderer.setYLabelsAlign(Align.RIGHT);
Intent intent = ChartFactory.getTimeChartIntent(context, buildDateDataset(titles, x, values),
renderer, "hh:mm:ss");
return intent;
}

Je dois mettre quoi dans le timer si je dois mettre ni
startActivity(intent);
, ni de type intent ?

Merci encore pour ton aide !!
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
14 nov. 2013 à 15:32
Intent intent = ChartFactory.getTimeChartIntent(context, buildDateDataset(titles, x, values),renderer, "hh:mm:ss"); 

C'est quoi, ça? Pourquoi tu as un intent en retour? C'est bizarrement fait...

Je ne comprends pas trop la conception. Pour moi, dans ton activity, tu as un objet de type "graphique" que tu dois mettre à jour tous les x temps. C'est ça?
0
roillion Messages postés 11 Date d'inscription mercredi 13 novembre 2013 Statut Membre Dernière intervention 6 mars 2014
14 nov. 2013 à 21:32
En fait j'utilise la démo de AchartEngine (https://github.com/ddanny/achartengine (la courbe SensorValuesChart) pour tracer la courbe. Il ne reste "plus qu'à" la rafraichir avec des nouvelles données toutes les 5s.

Du coup je ne sais pas trop quoi répondre à tes questions ^^

Oui j'ai bien un type "graphique" que je dois mettre à jour.
Mais si je met
startActivity(intent)
, ma courbe clignote.

Du coup je ne sais pas quoi mettre dans le timer.
  public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

context=this;
intent = chart.execute(context);

//Declare the timer
Timer t = new Timer();
//Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {
public void run() {
// ??? //
}
},
//Set how long before to start calling the TimerTask (in milliseconds)
0,
//Set the amount of time between each execution (in milliseconds)
5000);
}

Peut être qu'il faudrait faire un timer dans la méthode execute pour mettre à jour seulement les axes des abscisses et des ordonnées. Mais il faudra toujours rafraichir la courbe. C'est encore le même problème !

Sauf si le onResume() marche dans ce cas là ?
0
roillion Messages postés 11 Date d'inscription mercredi 13 novembre 2013 Statut Membre Dernière intervention 6 mars 2014
15 nov. 2013 à 18:37
Super !! Merci pour ces exemples !

J'ai pris le deuxième exemple qui fonctionne. J'ai plus qu'a enlever les boutons !

Par contre quand je supprime le bouton qui creer une nouvelle série (la ligne 100,101,102,103 et 120,121).

J'ai le message d'erreur : L'application s'est arrêtées...

C'est super bizarre non ? Il vient d'ou le problème ?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
18 nov. 2013 à 15:28
Yop!
Tu l'as supprimé où le bouton? Dans le XML? Si oui, il doit sûrement rester une référence dans le code.
0
roillion Messages postés 11 Date d'inscription mercredi 13 novembre 2013 Statut Membre Dernière intervention 6 mars 2014
22 nov. 2013 à 23:55
Ouai exact !

Un grand merci pour ton aide BunoCS !
0