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:
Der Thread , der die Infos holt:
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;
}
}