Hallo Gemeinde,
ich grüble schon seit Tagen über ein Problem und finde keine Lösung:
Meine Activity startet einen separaten "Netzwerk"-Thread, der eine TCP/IP Kommunikation mit einem Server handelt.
Momentan übergebe ich das Sendekommando einfach im Konstruktor des Netzwerk-Threads.
Der Thread baut eine Verbindung zum Server auf, schickt das im Konstruktor übergebene Kommando an den Server,
liest die Antwort zurück und sendet sie über einen Handler per Message an den UI-Thread.
Danach wird die Verbindung und der Thread wieder beendet.
Ich möchte allerdings, dass der Thread die Verbindung hält, und weitere Sendekommandos ausführt.
Nur: Wie bekomme ich die Kommandos vom UI Thread an den Netzwerk-Thread?
Alle Beispiele, die ich bisher gefunden haben, zeigen nur den Empfangsweg, nicht aber das Senden.
Ich stehe auf dem Schlauch.
Hier ist mein Code, den ich auf das Wesentliche zusammengeschrumpft habe:
public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
private Thread networkThread = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Hier wird das Kommando übergeben
// Das möchte ich hier aber nicht, sondern später per Buttonklick
networkThread = NetworkThread(mHandler, "GETSTATE");
networkThread.start();
}
final Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
Bundle bundle;
if(msg.what==1)
{
bundle = msg.getData();
Toast.makeText(getApplicationContext(),
String.valueOf(bundle.getInt("key1")),
Toast.LENGTH_LONG).show();
}
super.handleMessage(msg);
}
};
public void onClick(View v)
{
if ( v == buttonSend )
{
// hier sollen andere Kommandos gesendet werden
}
}
}
// der Netztwerk.Thread:
public class NetworkThread extends Thread
{
private static final String SERVER_URL = "Server";
private static final int SERVER_PORT = 8007;
private Handler messageHandler;
private String messageSend;
private String messageReceive;
public NetworkThread( Handler msgHandler, String msg )
{
this.messageHandler = msgHandler;
this.messageSend = msg;
}
// runnable
public void run()
{
//create the bundle
Bundle bundle = new Bundle(4);
try
{
Socket socket = new Socket( SERVER_URL, SERVER_PORT );
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// Write request to server
out.write(this.messageSend);
out.flush();
// read request response from server
this.messageReceive = in.readLine();
// Close the output stream
out.close();
in.close();
// Close the socket connection
socket.close();
}
catch(Exception ex)
{
//:TODO Handle exceptions
}
//create a message from the message handler to send it back to the main UI
Message msg = this.messageHandler.obtainMessage();
//specify the type of message
msg.what = 1;
//attach the bundle to the message
msg.setData(bundle);
//send the message back to main UI thread
this.messageHandler.sendMessage(msg);
}
}
Alles anzeigen