Comment tuer un thread et un gestionnaire avant d'aller à de nouvelles activités
Salut à tous - ce code peut être un peu brouillon dans la façon dont je suis en train de nettoyer le gestionnaire comme j'ai essayé de traquer où l'incident se produit...
J'ai une boîte de dialogue de l'activité qui est en montrant une entrée de mot de passe avec une barre de progression animée par un fil et un gestionnaire...
Il semble que lorsque que j'essaie pour voir si la barre de progression est fait, et en essayant de tuer le fil, la façon dont je le fais, c'est gâcher quelque chose quand j'essaie d'aller vers une nouvelle activité - c'est à dire dans une manière d'appeler une fonction et ne pas avoir à retourner à ou quelque chose...
public class RMO_Dialog extends Activity {
private ProgressBar progbar;
private Button dialogOK;
private EditText dialogPass;
private SharedPreferences prefs;
private String pass;
private int increment=10;
private Thread background;
private Boolean commCalled=false;
public void callCommunications(){
progbar.setVisibility(0);
progbar.setProgress(0);
background.stop();
Toast.makeText(getApplicationContext(), "Call communication should happen once.", Toast.LENGTH_LONG).show();
// Intent i = new Intent();
// i.setClass(RMO_Dialog.this, RMO_Comm.class);
// i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// startActivity(i);
// finish();
}
public void buzzUser(){
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
int dot = 200;
int dash = 500;
int short_gap = 200;
int medium_gap = 500;
int long_gap = 1000;
long[] pattern = {0,dot, short_gap, dot, short_gap, dot, medium_gap, dash, short_gap, dash, short_gap, dash, medium_gap, dot, short_gap,
dot, short_gap, dot, long_gap};
v.vibrate(pattern, -1);
}
public void killCountdown(){
progbar.setVisibility(0);
progbar.setProgress(0);
background.stop();
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.dialogpassword);
buzzUser();
prefs = this.getSharedPreferences("RMO", MODE_WORLD_READABLE);
pass = prefs.getString("password", "");
dialogOK = (Button) findViewById(R.id.dialogOK);
dialogPass = (EditText) findViewById(R.id.dialogPass);
progbar = (ProgressBar) findViewById(R.id.progress);
progbar.setProgress(0);
background = new Thread(new Runnable(){
@Override
public void run() {
try{
while(progbar.getProgress()<=progbar.getMax()){
Thread.sleep(300);
progressHandler.sendMessage(progressHandler.obtainMessage());
}
}catch(java.lang.InterruptedException e){
Toast.makeText(getApplicationContext(), "Error thrown.", Toast.LENGTH_LONG).show();
}
}
});
background.start();
dialogOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(dialogPass.getText().toString().equals(pass.toString())){
killCountdown();
Toast.makeText(getApplicationContext(), "Guardian Angel next alert has been disengaged.", Toast.LENGTH_LONG).show();
Intent intent = new Intent();
intent.setClass(RMO_Dialog.this, RMO.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}else{
callCommunications();
}
}
});
}
Handler progressHandler = new Handler(){
public void handleMessage(Message msg){
progbar.incrementProgressBy(increment);
if(progbar.getProgress()==progbar.getMax()){
Toast.makeText(getApplicationContext(), "commcalled: "+ commCalled, Toast.LENGTH_LONG).show();
if(commCalled==false){
commCalled=true;
callCommunications();
}
}
}
};
}
J'ai corrigé votre mise en forme un peu, n'oubliez pas de sélectionner votre code et cliquez sur le mise en forme du code bouton (101010)... vous pouvez également formater votre code une fois que vous soumettez votre question en cliquant sur modifier au-dessous de la question.
OriginalL'auteur grimmwerks | 2010-09-12
Vous devez vous connecter pour publier un commentaire.
Fil de discussion.l'arrêt est déconseillé d'appel, au lieu de cela, vous devez utiliser le Fil de discussion.interruption méthode.
Thread.Interrupt
sera la cause d'uneThreadInterruptedException
prochaine fois que votre thread se bloque ou dort et vous êtes déjà en cours de traitement dans votre corps de fil de sorte que c'est bon. En outre, vous pouvez inclure unevolatile
indicateur qui vous permettra d'arrêter le thread quand il n'est pas de blocage ou de dormir, mais c'est facultatif.super! Aussi - s'il vous plaît n'oubliez pas d'accepter la question qui vaut mieux résoudre votre problème en cliquant sur la case à cocher à gauche (juste en dessous de la voix).
Lirik - je voudrais bien, mais ce n'est pas ma question 😉
MDR!!! J'ai totalement raté ce petit fait :).
OriginalL'auteur Kiril
Vous pouvez envisager d'utiliser un AsyncTask instance au lieu d'un exécutable et un gestionnaire.
Si vous devez annuler un AsycnTask exemple juste appeler
.cancel(true)
sur votre AsyncTask objet de référence. Cela va prendre soin de l'arrière-plan de la méthode (doInBackground()
) et les progrès de mise à jour (onProgressUpdate()
).Je trouve généralement AsyncTask plus facile à utiliser que d'essayer de gérer tous les détails à moi-même.
Ainsi, à l'intérieur RMO_Dialog, utiliser l'appel
execute()
sur une instance d'une classe qui extends AsyncTask.OriginalL'auteur Peter Ajtai