Activity lässt sich nicht beenden

  • Antworten:5
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 4

10.01.2015, 21:36:18 via Website

Hallo Community,

mich quält gerade folgendes Problem.

  • Activity wird gestartet
  • über einen Buttonklick wird eine zweite Activity gestartet
  • diese zweite Activity startet einen Thread
  • sobald der Thread beendet wird, soll auch die zweite Activity beendet und die erste Activity wieder angezeigt werden

So sieht mein Versuch aus:

Activity eins:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class ActivityEins extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_eins);
    }

    public void button1(View view) {
        Intent i = new Intent(getApplicationContext(), ActivityZwei.class);
        startActivity(i);
    }
}

Activity zwei

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;

public class ActivityZwei extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_zwei);
    }

    public void button2(View view) {
        TestThread testThread = new TestThread();
        testThread.start();
    }

    public Handler messageHandler = new Handler() {
        public void handleMessage(Message msg) {
            finish();
        }
    };
}

TestThread

import android.os.Looper;
import android.os.Message;

public class TestThread extends Thread {

    @Override
    public void run() {
        Looper.prepare();

        try {                                           
            Thread.sleep(1000);                             
        } catch (InterruptedException e) {                  
            e.printStackTrace(); }

        Message mes = new Message();
        mes = null;
        ActivityZwei az = new ActivityZwei();
        az.messageHandler.handleMessage(mes);
    }
}

Der finish()Befehl in der Activity zwei wird zwar ausgeführt, tut aber nicht was von ihm erwartet wird. Die Activity zwei wird nicht geschlossen. :'(

Wie kann ich dies bewerkstelligen?

Damit mein Programm funktioniert, müssen sich die beiden Activitys und der Thread in eigenen Klassen befinden.

Danke für Eure Hilfe :)

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.168

10.01.2015, 22:16:30 via Website

Hallo Worf01,
Herzlich wilkommen hier im Forum :)



Dein Fehler liegt darin, dass du eine neue instanz der 2. Activity öffnetst, dann kann das ganze nicht funktionieren.
Du musst die aktuelle instanz in der 2. Activity mit in den Thread übergeben um dann auf den messageHandler zugreifen zu können.
btw: Was macht das für einen Sinn die Activity aus einem Thread zu schließen?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 4

11.01.2015, 09:07:12 via Website

Hallo Pascal,

vielen Dank für Deine schnelle Antwort.
Das Programm was ich hier abgedruckt habe ist nur eine Vereinfachung eines größeren Programmes, wo das Schließen einer Activity aus einem Thread heraus notwendig ist.
Ich dachte, dass ich mit dem messageHandler automatisch auf die bestehende 2. Activity zugreife.
Könntest Du mir bitte ein kleines Codebeispiel geben wie es richtig geht? :D

Danke für Deine Mühe.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.168

11.01.2015, 11:34:08 via Website

So würde es funktionieren:

Activity zwei

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;

public class ActivityZwei extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_activity_zwei);
}

public void button2(View view) {
    TestThread testThread = new TestThread(this); //Deine Activity als Parameter übergeben 
    testThread.start();
}

public Handler messageHandler = new Handler() {
    public void handleMessage(Message msg) {
        finish();
    }
};

}

TestThread

import android.os.Looper;
import android.os.Message;

public class TestThread extends Thread {
ActivityZwei _act2;
public TestThread(ActivityZwei act)
{
_act2 = act; //Im Konstruktor Activity2 als Klassenvariable speichern
}

@Override
public void run() {
    Looper.prepare();

    try {                                           
        Thread.sleep(1000);                             
    } catch (InterruptedException e) {                  
        e.printStackTrace(); }

    Message mes = new Message();
    mes = null; 

    _act2.messageHandler.handleMessage(mes);
}

}

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.168

11.01.2015, 14:22:15 via Website

Schön das deine Frage beantwortet ist. :)

Bitte setze deinen Thread noch auf Beantwortet, idem du im Browser über deinem ersten Post auf "Mehr"->"Beantwortet" klickst.
Danke (smug)
LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten

Empfohlene Artikel