Variable im laufenden Thread ändern

  • 3 Antworten
  • Letztes Antwortdatum
A

audacity363

Gast
Guten Tag,
ich habe folgendes Problem: in einem Thread der beim Appstart gestartet wird, wird von einem Server alle fünf Sekunden Informationen gezogen.
Dieser Server steht bei mir zu Hause und schickt diese Informationen auch noch an einen Starto Server. Wenn ich jetzt mal nicht im Heimischen Netzwerk bin soll die Information Abholung über den root Server laufen. Dies mache ich einfach über die Menütaste. Dort kann ich zwischen den beiden Servern wechseln.
Wenn ich jetzt allerdings in der MainActivity auf den Netzwerkthread zugreife und den Server ändere passiert gar nichts. habe schon an einen Deadlock gedacht aber selbst, wenn ich eine exit Variable setzte, bei der er einfach aus der Endlosschleife rausfliegt, wird diese nicht übernommen.

Server Änderung:
Code:
public boolean onOptionsItemSelected(MenuItem item) 
	{
		System.out.println("Menue Button");
	    // Handle item selection
	    switch (item.getItemId()) 
	    {
	        case R.id.raspberry_server:
	        	server = "192.168.178.48";
	        	Context context = getApplicationContext();
	        	CharSequence text = "Server: RaspberryPi";
	        	int duration = Toast.LENGTH_SHORT;
	        	Toast toast = Toast.makeText(context, text, duration);
	        	toast.show();
	        	Status infos = new Status(server, 6565, "informationen", this);
	        	infos.Server = server;
	            return true;
	        case R.id.strato_server:
	        	server = "strato_server.bla";
	        	Context context1 = getApplicationContext();
	        	CharSequence text1 = "Server: Strato";
	        	int duration1 = Toast.LENGTH_SHORT;
	        	Toast toast1 = Toast.makeText(context1, text1, duration1);
	        	toast1.show();
	        	Status infos1 = new Status(server, 6565, "informationen", this);
	        	infos1.exit = true;
	        	System.out.println(infos1.exit);
	        	try
	        	{
	        		System.out.println("Warte auf Thread");
	        		infos1.join();
	        		System.out.println("Thread beendet");
	        	}
	        	catch(Exception e)
	        	{
	        		
	        	}
	        	infos1.start();
	        	return true;
	        default:
	            return super.onOptionsItemSelected(item);
	    }
	}

Der Thread , der die Infos holt:
Code:
package de.raspberrypi.homecontroll;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import android.app.*;
import android.widget.*;


public class Status extends Thread
{
	
	public String Server;
	int Port;
	public String input;
	Activity myActivity;
	public boolean server_status;
	String nachricht;
	String[] infos;
	public Boolean exit = false;
	
	
	public Status(String Server, int Port, String Nachricht, Activity myActivity)
	{
		this.Server = Server;
		this.Port = Port;
		this.myActivity = myActivity;
		this.nachricht = Nachricht;
		System.out.println("Status init " + this.Server);
	}
	public void run()
    {
		while(true)
		{
			System.out.println("Sende: "+ nachricht + " an: " + Server);
	    	try
	    	{
	    		System.out.println("Versuche zu verbinden");
	    		java.net.Socket socket = new java.net.Socket(Server,Port); // verbindet sich mit Server
	    		System.out.println("Verbindung erfolgreich");
	        	schreibeNachricht(socket, nachricht);
	        	input = leseNachricht(socket);
	        	System.out.println(input);
	        	server_status = true;
	    	}
	    	catch(IOException e)
	    	{
	    		System.out.println("im catch");
	    		server_status = false;
	    	}
	    	myActivity.runOnUiThread(new Runnable()
	    	{
	    		
	    		public void run()
	    		{
	    			
	    			TextView fehler= (TextView) myActivity.findViewById(R.id.fehler);
	    			TextView rolladen_status= (TextView) myActivity.findViewById(R.id.rolladen_status);
	    			
	    			Button fernseher_button = (Button) myActivity.findViewById(R.id.fernseher_button);
	    			Button led_button = (Button) myActivity.findViewById(R.id.hintergrundbeleuchtung_button);
	    			TextView licht_aussen = (TextView) myActivity.findViewById(R.id.licht_aussen);
	    			TextView temp_aussen = (TextView) myActivity.findViewById(R.id.temp_aussen);
	    			TextView temp_innen = (TextView) myActivity.findViewById(R.id.temp_innen);
	    			TextView licht_innen = (TextView) myActivity.findViewById(R.id.licht_innen);
	    			
				    	
				    	if(server_status)
				    	{
				    		fehler.setText("");
				    		try
				    		{
				    			infos = input.split(",");
				    			System.out.println("0 " + infos[0]);
				    			temp_aussen.setText(infos[0]);
				    			System.out.println("1 " + infos[1]);
				    			licht_aussen.setText(infos[1]);
				    			System.out.println("5 " +infos[5]);
				    			licht_innen.setText(infos[5]);
				    			System.out.println("6 " + infos[6]);
				    			temp_innen.setText(infos[6]);
				    		}
				    		catch(Exception f)
				    		{
				    			System.out.println("im catch infos schreiben");				    		
				    		}
				    	}
				    	else
				    	{
				    		fehler.setText("FEHLER: SERVER nicht erreichbar");
				    	}
				    	
				    	
	    			}
	    		
	    	});
	    	System.out.println("Exit: " + exit);
	    	
	    	if(exit == true)
	    	{
	    		break;
	    	}
	    	
	    	try
	    	{
	    		Thread.sleep(5000);
	    	}
	    	catch(Exception e)
	    	{
	    		
	    	}
		}
		System.out.println("Status beendet");
    }
    
    void schreibeNachricht(java.net.Socket socket, String nachricht) throws IOException 
    {
        PrintWriter printWriter =
           new PrintWriter(
               new OutputStreamWriter(
                   socket.getOutputStream()));
       printWriter.print(nachricht);
       printWriter.flush();
   }
   String leseNachricht(java.net.Socket socket) throws IOException 
   {
       BufferedReader bufferedReader =
           new BufferedReader(
               new InputStreamReader(
                   socket.getInputStream()));
       char[] buffer = new char[900];
       int anzahlZeichen = bufferedReader.read(buffer, 0, 900);
       String nachricht = new String(buffer, 0, anzahlZeichen);
       return nachricht;
   }
}
 
Wie änderst du denn den Server in dem Status thread?
und was sagt die Server Variable im Debugging nachdem du sie geändert hast?

Und wo startest du den thread im ersten switch statement?
 
Wie änderst du denn den Server in dem Status thread?
In diesem Fall über den Aufruf der Klasse:
Code:
Status infos = new Status(server, 6565, "informationen", this);

und was sagt die Server Variable im Debugging nachdem du sie geändert hast?
Werde ich jetzt mal machen und Bescheid sagen.

Und wo startest du den thread im ersten switch statement?

Gar nicht. Erstmal guck ich das es bei einem läuft.

Der ursprüngliche Beitrag von 15:01 Uhr wurde um 15:27 Uhr ergänzt:

OKey der Debugger will nicht so wie ich, aber wenn ich einfach ein System.out dahinter und davor packe ändert sich nichts.
 
Ich versteh gerade nicht was du machst.
Ich dachte du willst in einem vorhanden Thread die variable ändern.
Das geht natürlich nicht mit new Status(....)

Wenn ich das richtig sehe dürfte dein programm aktuell einmal den thread starten direkt mit break die schleifen verlassen und ist dann beendet.

Sagen wir du kommst zuerst zum strato server machst dann alles und wenn du den wert jetzt ändern willst musst du mit infos1.Server = "neuer server" den server ändern.

Bei dir im Code wird ja nirgendwo der Server geändert, das passiert einfach nicht, der wird nur beim erstellen des Objektes übergeben und bleibt dann "für immer" in dem besagten Thread.
 

Ähnliche Themen

AnnaBauer21
Antworten
14
Aufrufe
1.190
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten