Aus Thread heraus Activity starten

  • 5 Antworten
  • Letztes Antwortdatum
B

BlupBlup

Ambitioniertes Mitglied
1
Hi, ich möchte aus einem Thread heraus eine bestimmte
Activity aufrufen. Welche Activity augerufen werden soll
hängt vom String ab der über eine Sockeverbindung vom Server
an die App gesendet wird.

Nun hab ich das Problem, dass ich die Methode startActivity nicht aufrufen
kann, da ich von Thread erbe und nicht von Activity.
Die Methode startActivity ist allerdgins ein Methode von Activity.
Das heißt ich müsste eine Referenz auf ein Acitivity Objekt übergeben, so
wie ich das sehe. Oder gibt es da eine andere Möglichkeit?

Wenn ich in meiner StartActivity bin wechsel ich über einen Button zu einer zweiten Activity. In der zweiten Activity starte ich den Thread dessen Code unten zu sehen ist. Ich könnte jetzt zwar dem Thread eine Referenz auf die zweite Activity übergeben, doch sobald ich in der zweiten Activity die Back Taste drücke und zur StartActivity zurückkehre wird mir die zweite Activity zerstört. Damit würde sich die Frage stellen was referenziert der Thread dann noch? Kann ja nicht mit einer Referenz auf einer zerstörten Activity arbeiten.

Wie geht man da also am besten vor?

Code:
public class SignalClientThread extends Thread
{
    private String ip;
    private int port;
    private String signal;
    private BufferedReader in;
    private PrintWriter out;
    private Socket clientSocket;
    
    
    public SignalClientThread(String ip, int port)
    {
        this.ip = ip;
        this.port = port;
    }
    
    
    public void run()
    {        
        try 
        {
            this.clientSocket = new Socket(ip, port);    
            this.in = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
            this.out = new PrintWriter(this.clientSocket.getOutputStream(), true);
            boolean run = true;
            
            while(run)
            {
                this.signal = this.in.readLine();
                
                if(signal.equals("Phase 1"))
                {
                    Intent intent = new Intent(context, PhaseOne.class);
                    startActivity(intent);
                }
                else if(signal.equals("Phase 2"))
                {
                    Intent intent = new Intent(context, PhaseTwo.class);
                    startActivity(intent);
                }
                else if(signal.equals("Phase 3"))
                {
                    Intent intent = new Intent(context, PhaseThree.class);
                    startActivity(intent);
                }
            }
        }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        } 
    }
    
    
    public void sendSignal(String signal)
    {
        this.out.print(signal);
        this.out.println();
    }
}
 
Gib "this" von acitivy 1 und acitivy 2 an thread. Wenn du bei acitivy 2 zurück drückst, kannst du im onDestroy iwo eine variable setzten. Sobald der thread fertig ist kannst du prüfen ob die variable gesetzt ist = acitivy1.startActivity bzw wenn sie nicht gesetzt ist = acitivity2.startAcitivity

Gesendet von meinem Nexus 4 mit Tapatalk 4
 
  • Danke
Reaktionen: BlupBlup
Danke für den Hinweis
 
oder du übergibst deinem SignalClientThread einen Handler mit dem du dann auf den UIThread wieder zurück greifen kannst, soweit ich mich erinnere...
 
  • Danke
Reaktionen: BlupBlup
Kannst du nicht das ApplicationContext objekt nutzen?
Das übergibst du an deinen Thread (bekommst du mit <ActivityObject>.getApplicationContext).
Context hat die methode startActivity (von da erbt Activity es auch selbst).

Dann ist es egal welche Activity gerade noch aktiv ist.

Hab ich noch nie probiert sollte theoretisch aber funktionieren.
 
  • Danke
Reaktionen: BlupBlup
Danke für die Hinweise
 

Ähnliche Themen

D
Antworten
5
Aufrufe
662
swa00
swa00
Zurück
Oben Unten