[Android] Thread.sleep
JackDannyL
Messages postés
12
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Comme je n'ai eu aucune réponse je réédite mon toppic. Je ne sais pas si c'est pcq je programme en java pour Android que personne ma répondu mais je me réessaille. J'espere trouver un géni qui saura m'expliquer pourquoi cela ne fonctionne pas et quoi faire pour que ca marche.
J'essaye de faire des pauses Thread.sleep()dans une boucle (for) pour que mon ScrollView scroll tout seul... donc faire un AutoScroll ou texte auto-défilant.
Cela fait maintenant 2 jours que je suis bloqué, j'ai googlé presque tout ce qui est possible a ce sujet... J'ai beaucoup lu sur les Threads.sleep() mais rien n'aboutit.
Voici mon code, je l'ai réduit au plus simple. J'utilise API 7 comme minimum SDK.
Mon MainActivity en java, crée avec Eclipse, que j'ai nommé testsleep :
Et mon fichier XML activity_main
Quand je met la portion[try {Thread.sleep(10000);} catch (InterruptedException e {return;}] dans la boucle for ca plante. Comme si il compilait le Thread.sleep() un par dessus l'autre sans l'executé et faire une pause comme prévu et sature la mémoire. Pourtant c'est ce que je vois partout sur le net pour faire une pause dans un for.
Quand je mets ces 2 lignes en dehors de la boucle for... avant ou apres... il fait une pause de 10 sec avant d'effectuer la boucle for d'un coup. Mais rien a faire dans la boucle.
Est-ce qu'il y a de quoi que j'ai mal compris a propos des Threads...
merci beaucoup d'y répondre...
Comme je n'ai eu aucune réponse je réédite mon toppic. Je ne sais pas si c'est pcq je programme en java pour Android que personne ma répondu mais je me réessaille. J'espere trouver un géni qui saura m'expliquer pourquoi cela ne fonctionne pas et quoi faire pour que ca marche.
J'essaye de faire des pauses Thread.sleep()dans une boucle (for) pour que mon ScrollView scroll tout seul... donc faire un AutoScroll ou texte auto-défilant.
Cela fait maintenant 2 jours que je suis bloqué, j'ai googlé presque tout ce qui est possible a ce sujet... J'ai beaucoup lu sur les Threads.sleep() mais rien n'aboutit.
Voici mon code, je l'ai réduit au plus simple. J'utilise API 7 comme minimum SDK.
Mon MainActivity en java, crée avec Eclipse, que j'ai nommé testsleep :
package com.example.testsleep;
import com.example.testsleep.R.id;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
import android.app.Activity;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button Button_AutoScroll = (Button)findViewById(id.Button_AutoScroll);
Button_AutoScroll.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TextView Text_Scrolable = (TextView) findViewById(id.Text_Scrollable);
ScrollView Scroll_Window = (ScrollView)findViewById(id.Scroll_Window);
for (int ScrollPos = 0; ScrollPos < Text_Scrolable.getHeight();++ScrollPos)
{
try {Thread.sleep(10000);} ////ici ca plante
catch (InterruptedException e) {return;}
Scroll_Window.smoothScrollTo(0, ScrollPos);
}
}
});
}
}
Et mon fichier XML activity_main
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/Layout_MainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ScrollView
android:id="@+id/Scroll_Window"
android:layout_width="300dp"
android:layout_height="175dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
<TextView
android:id="@+id/Text_Scrollable"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="blablablblablalblablalblabllablalblablalbla
lbalbalblbllablalblablalblablablablalblablalbalblablalbla
blablablalbalblablablalbalblablablalblablalblabllbalalbal
lblablalbbalblablablblblablablablalbbalblablbalblblalbbla
blablablblbalbablbalalbalbblablbalbblalblablalblalalbblbl
lblbalblablalblablablalblablablalbalblablablalblablablblb
lblablalbalblablablablablblablablalablalblablablalblablba
lblabllablalblablalblablalblalblablalblalblblablalblalblb
lbalbalblbllablalblablalblablablablalblablalbalblablalbla
blablablalbalblablablalbalblablablalblablalblabllbalalbal
lblablalbbalblablablblblablablablalbbalblablbalblblalbbla
blablablblbalbablbalalbalbblablbalbblalblablalblalalbblbl
lblbalblablalblablablalblablablalbalblablablalblablablblb
lblablalbalblablablablablblablablalablalblablablalblablba
lblabllablalblablalblablalblalblablalblalblblablalblalblb
lbalbalblbllablalblablalblablablablalblablalbalblablalbla
blablablalbalblablablalbalblablablalblablalblabllbalalbal
lblablalbbalblablablblblablablablalbbalblablbalblblalbbla
blablablblbalbablbalalbalbblablbalbblalblablalblalalbblbl
lblbalblablalblablablalblablablalbalblablablalblablablblb
lblablalbalblablablablablblablablalablalblablablalblablba
lblabllablalblablalblablalblalblablalblalblblablalblalbl"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#673F18" />
</ScrollView>
<Button
android:id="@+id/Button_AutoScroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="AutoScroll" />
</RelativeLayout>
Quand je met la portion[try {Thread.sleep(10000);} catch (InterruptedException e {return;}] dans la boucle for ca plante. Comme si il compilait le Thread.sleep() un par dessus l'autre sans l'executé et faire une pause comme prévu et sature la mémoire. Pourtant c'est ce que je vois partout sur le net pour faire une pause dans un for.
Quand je mets ces 2 lignes en dehors de la boucle for... avant ou apres... il fait une pause de 10 sec avant d'effectuer la boucle for d'un coup. Mais rien a faire dans la boucle.
Est-ce qu'il y a de quoi que j'ai mal compris a propos des Threads...
merci beaucoup d'y répondre...
A voir également:
- [Android] Thread.sleep
- Android recovery - Guide
- Begone android - Accueil - Protection
- À quoi sert google drive sur android - Guide
- Historique presse-papier android - Guide
- Emulateur pokemon android - Guide
2 réponses
Bonjour,
Une suggestion: tu a essayé de supprimer le return dans le catch et la remplacer par un println() ?
Une suggestion: tu a essayé de supprimer le return dans le catch et la remplacer par un println() ?
"Je ne sais pas si c'est pcq je programme en java pour Android que personne ma répondu"
C'est possible en effet. Moi par exemple je n'y connais rien ^^
Cependant Google donne des résultats intéressants.
Thread.sleep a reçu une InterruptedException, cela signifie qu'il y a quelque part dans ton interface graphique, quelque chose qui veut accéder au thread et que le sleep l'en empêche. Du coup tu pourrais faire
Du coup, faire des tâches programmées dans le temps serait peut-être plus adapté, comme ça tu planifies maintenant ce qui doit être fait, et après tu rends la main, sans bloquer tout le reste. Exemple :
Remarque : j'ai fait le code de tête, il faudra l'adapter sur Android, il manque sûrement des mots clés "final" pour les variables qui sont manipulées dans le Runnable. De plus comme ton traitement est très long (10 secondes x getHeight) il faudrait également envisager (peut-être) que ton action puisse être interrompue avant la fin de son exécution...
C'est possible en effet. Moi par exemple je n'y connais rien ^^
Cependant Google donne des résultats intéressants.
Thread.sleep a reçu une InterruptedException, cela signifie qu'il y a quelque part dans ton interface graphique, quelque chose qui veut accéder au thread et que le sleep l'en empêche. Du coup tu pourrais faire
android.os.SystemClock.sleep(1000);qui sera sourd à l'InterruptedException. Malheureusement cela risque de freezer ton interface graphique parce que l'élément qui a lancé l'InterruptedException va devoir attendre que les 10 secondes se soient écoulées pour s'exécuter, avec d'éventuelles répercussions sur l'affichage.
Du coup, faire des tâches programmées dans le temps serait peut-être plus adapté, comme ça tu planifies maintenant ce qui doit être fait, et après tu rends la main, sans bloquer tout le reste. Exemple :
for (int scrollPos=0; scrollPos<textScrolable.getHeight(); scrollPos++) { new Handler().postDelayed(new Runnable() { public void run() { scrollWindow.smoothScrollTo(0, scrollPos); } }, 10000*scrollPos); }
Remarque : j'ai fait le code de tête, il faudra l'adapter sur Android, il manque sûrement des mots clés "final" pour les variables qui sont manipulées dans le Runnable. De plus comme ton traitement est très long (10 secondes x getHeight) il faudrait également envisager (peut-être) que ton action puisse être interrompue avant la fin de son exécution...