Comment arrêter ce fil dans android?
Dans mon application j'utilise ce fil pour faire tourner l'aiguille des secondes sur l'horloge. Mais le Problème est que si je ferme l'activité, le fil est toujours rester exécuter. Je veux arrêter le fil de sorte qu'il ne peut pas l'effet de la Bettry de l'appareil.
Ci-dessous mon code d'Activité où je suis rotation de l'Horloge de Seconde Main:
public class ClockActivity extends Activity implements OnClickListener{
private Button chimeBtn;
private ImageView img;
private Thread myThread = null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.clock_layout);
Runnable runnable = new CountDownRunner();
myThread = new Thread(runnable);
myThread.start();
chimeBtn = (Button) findViewById(R.id.chimeBtn);
chimeBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.chimeBtn:
playSound(R.raw.one_bell);
break;
}
}
public void playSound(int resources){
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resources);
mp.start();
}
private void doPlay(){
new Thread(new Runnable() {
@Override
public void run() {
//TODO Auto-generated method stub
Log.v("log_tag", "this is seocond thread");
}
}).start();
}
public void doRotate() {
runOnUiThread(new Runnable() {
public void run() {
try {
Date dt = new Date();
int hours = dt.getHours();
int minutes = dt.getMinutes();
int seconds = dt.getSeconds();
String curTime = hours + ":" + minutes + "::" + seconds;
Log.v("log_tag", "Log is here Time is now" + curTime);
img = (ImageView) findViewById(R.id.imgsecond);
RotateAnimation rotateAnimation = new RotateAnimation((seconds - 1) * 6, seconds * 6,
Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setFillAfter(true);
img.startAnimation(rotateAnimation);
} catch (Exception e) {
Log.e("log_tag", "Error msg is " + e.toString());
}
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
System.out.println("Back Key Press");
if (myThread != null) {
myThread.interrupt(); //says that the myThread should stop
try{
myThread.join(); //make this myThread wait for the other myThread to finish before returning
myThread = new Thread();
myThread = null;
}catch(InterruptedException ie){
//handle the case if the thread.join is interrupt
//don't know if this will ever happen, if it can... throw a runtime exception?, or reinterrupt?
Thread.currentThread().interrupt();
// reinterrupt because thrown exception cleared interrupt and hope it's handled elsewhere
}
}
System.out.println("Back Key Press");
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public void onDestroy(){
System.out.println("OnDestroy");
super.onDestroy();
}
class CountDownRunner implements Runnable {
//@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
//Log.v("log_tag", "Roate is going");
doRotate();
Thread.sleep(1000);
//doPlay();
} catch (InterruptedException e)
{
//Thread.currentThread().interrupt();
} catch (Exception e) {
Log.e("log_tag", "Error is " + e.toString());
}
}
}
}
}
Merci d'avance.
Vous devez vous connecter pour publier un commentaire.
ne pas
myThread.join()
sur le thread d'INTERFACE utilisateur car il permet de bloquer jusqu'à ce que le Thread terminé et votre Application peut ANR. AussiThread.currentThread().interrupt();
va essayer d'interrompre le thread d'INTERFACE utilisateur qui est vraiment mauvais.Vous pouvez mettre
MyThread.interrupt()
dansonDestroy
,onPause
ouonStop
(+ recréer le Fil dans le début correspondante de rappel)catch (InterruptedException e)
est le signal d'arrêt de votre fil. Si vous le prenez alors queisInterrupted()
retournera false par la suite (autant que je sache)return;
dans le bloc catch et peut-être ajouter quelquesLog.d()
de débogage pour votre thread / onDestroy de voir que lorsque les méthodes sont appelées.essayer ce code dans votre activité -
Lorsque vous sortez de votre demande, votre demande n'est pas réellement détruits. Si vous détruisez votre processus, tous les processus enfants(tous de votre enfant threads) seront détruits.
Ok, cela signifie que vous souhaitez créer un service qui ont été en cours d'exécution en arrière-plan. Une seule chose est que le service est un type de fil, si il sera exécuté en arrière-plan qui permettra de vider la batterie de votre appareil de puissance. Donc, si vous tuez votre processus, puis le fil ainsi que votre service à la détruire. Alors, arrêtez votre fil comme -
Lorsque vous quittez votre application, le fil va s'arrêter. Et les autres restent en cours d'exécution, c'est-à votre service. N'essayez pas d'arrêter votre fil de force, ou de le suspendre. Il est déconseillé, si votre boucle while du fil se casse, alors il sera automatiquement détruire votre fil en fonction de la JVM des règles.
Espérons qu'il saura vous aider.
Avoir du plaisir...