Wie tötet man einen thread und handler, bevor Sie gehen, um eine neue Aktivität
Hey alle - dieser code vielleicht ein bisschen chaotisch in der Weise, die ich bin versucht zu reinigen, bis der handler als ich versucht habe, auf die Spur, wo der crash passiert...
Ich habe einen dialog, Aktivität, zeigt eine Passwort-Eingabe mit einem progressbar animiert durch einen thread und handler...
Scheint es, dass, wenn ich versuche, um zu sehen, wenn die progressbar fertig ist, und versuchen zu töten, der thread, so wie ich das hier mache, ist etwas Durcheinander, wenn ich versuche zu gehen zu einer neuen Aktivität - das heißt in einer Weise, die eine Funktion aufrufen und nicht mit nichts zurück zu oder so...
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();
}
}
}
};
}
Ich fixierte Ihre Formatierung ein bisschen, vergessen Sie nicht, wählen Sie Ihren code ein und klicken Sie auf den code-Formatierung-Taste (101010)... Sie können auch formatieren Sie den code nach Absenden Ihrer Frage, indem Sie auf Bearbeiten unterhalb der Frage.
InformationsquelleAutor grimmwerks | 2010-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Thread.stop ist veraltet nennen, stattdessen sollten Sie die Thread.unterbrechen Methode.
Thread.Interrupt
verursachenThreadInterruptedException
nächste mal deinen thread-Blöcke oder schläft und du bist schon das handling in thread-body, also das ist gut. Darüber hinaus möchten Sie vielleicht, um einevolatile
fahne, können Sie aufhören den thread, wenn es nicht blockieren oder zu schlafen, aber das ist optional.Super!!! Auch - bitte nicht vergessen zu akzeptieren, die Frage, die am besten Ihr Problem gelöst, indem Sie auf das Häkchen auf der linken Seite (knapp unter der Stimmen).
Lirik - ich würde, aber es ist nicht meine Frage 😉
ROFL!!! Hab ich Total verpasst, Tatsache :).
InformationsquelleAutor Kiril
Könnten Sie erwägen, einen AsyncTask - Instanz anstelle einer lauffähigen und einen handler.
Wenn Sie Abbrechen müssen AsycnTask Instanz rufen
.cancel(true)
auf deinen AsyncTask Objekt-Referenz. Diese kümmern wird sowohl der hintergrund-Methode (doInBackground()
) und die Fortschritte updater (onProgressUpdate()
).Ich in der Regel finden AsyncTask einfacher zu verwenden als zu versuchen, sich um alle details selbst.
So, innerhalb RMO_Dialog, verwenden Sie call
execute()
auf eine Instanz einer Klasse, die Sie erstellen, extends AsyncTask.InformationsquelleAutor Peter Ajtai