A
aw29erac
Neues Mitglied
- 2
Hallo Leute,
ich hab einen Socketclient in einem AsyncTask realisiert. Senden und Empfangen klappt wunderbar. Ich lese den InputStream vom Server kontinuierlich aus und sobald etwas empfangen wurde werden die Daten an "onProgressUpdate" übergeben. Mit einer TextView kann ich diese dann schön anzeigen lassen.
Mein Problem ist jetzt aber, dass ich die Daten in einen String speichern möchte, um sie so im UI-Thread weiterverwenden zu können(plotten oder in TextView anzeigen lassen, je nach empfangenen Daten). Also den AsyncTask mit dem UI-Thread synchronisieren.
Und das wichtigste, dass ich im UI-Thread erkenne, wann Daten in diesem String stehen, damit ich dann damit weiter arbeiten kann.
Wenn ich das wie folgt mache, dann hängt sich die App auf^^
public class MainActivity extends Activity{
public String antwort;
TextView outputStream;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_plot);
private static final String IP = "192.168.178.10";
outputStream = (TextView)findViewById(R.id.output);
antwort = null;
//Initialisieren
socketclient = new SocketClient();
socketclient.execute(IP);
/**** warten bis Socketverbindung steht ****/
int rettich = 0;
while(rettich == 0){// der rettich wird 1, wenn der AsyncTask äuft
if(socketclient.getStatus() == AsyncTask.Status.RUNNING){
socketclient.Send("Wie ist dein Name"); // Befehl der gesendet wird
rettich = 1;
}
}
while(rettich == 1){
if(antwort != null ){
outputStream.setText(antwort);
rettich = 2;
}
}
}
/*********** die Socketverbindung findet in einem AsyncTask statt ***********/
public class SocketClient extends AsyncTask<String, String, Boolean>{
private static final int PORT = 5025;
private static final int timeout = 0;// Timeout ist unendlich
Socket socket;
PrintWriter out;
BufferedReader in;
@Override
protected void onPreExecute(){
// Hier kommt rein, was direkt vor dem Aufbauen der Socket-Verbindung passieren soll
}
@Override
protected Boolean doInBackground(String... ipAdr) {
boolean result = false;
try {
SocketAddress addr = new InetSocketAddress(ipAdr[0],SCR_PORT);
socket = new Socket();
socket.connect( addr, timeout);
if (socket.isConnected()){
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
isReady = true;
while(true){ // InputStream wird dauerhaft ausgelesen, bis AsyncTask gecancelled wird
publishProgress(in.readLine());
}
}else{
Log.v("AsyncTaskError", "socket ist über den Timeout");
}
} catch (UnknownHostException e1) {
e1.printStackTrace();
result = true;
} catch (IOException e1) {
e1.printStackTrace();
result = true;
}catch(Exception e){
e.printStackTrace();
result = true;
}finally{
closeSocket();
}
return result;
}
// Methode schließt die Sockt-Verbindung
public void closeSocket(){
try {
in.close();
out.close();
socket.close();
} catch (IOException e2) {
e2.printStackTrace();
}catch(Exception e2){
e2.printStackTrace();
}
}
// Methode sendet ein Kommando
public void Send(String cmd){
out.println(cmd);//Befehl senden
out.flush();// runterspülen^^
}
// Diese Methode wird immer aufgerufen, wenn ein Input empfangen wird
@Override
public void onProgressUpdate(String... werte){
if (werte.length > 0) {// wenn Daten empfangen wurden
// antwort = werte[0];// Das bringt nichts leider
outputStream.setText(werte[0]);
}
}
// Methode wird aufgerufen, wenn der Task beendet wird
@Override
protected void onCancelled(){
outputStream.setText("Verbindung getrennt!");
}
@Override
protected void onPostExecute(Boolean result) {
if(result){
outputStream.setText("Verbindung beendet mit Fehler!");
}else{
outputStream.setText("Verbindung beendet ohne Fehler!");
}
}
}
}
Bin für jede Hilfe dankbar! Ist nur ein Auszug! (kleine Fehler können sich eingeschlichen haben, bitte nicht beachten)
ich hab einen Socketclient in einem AsyncTask realisiert. Senden und Empfangen klappt wunderbar. Ich lese den InputStream vom Server kontinuierlich aus und sobald etwas empfangen wurde werden die Daten an "onProgressUpdate" übergeben. Mit einer TextView kann ich diese dann schön anzeigen lassen.
Mein Problem ist jetzt aber, dass ich die Daten in einen String speichern möchte, um sie so im UI-Thread weiterverwenden zu können(plotten oder in TextView anzeigen lassen, je nach empfangenen Daten). Also den AsyncTask mit dem UI-Thread synchronisieren.
Und das wichtigste, dass ich im UI-Thread erkenne, wann Daten in diesem String stehen, damit ich dann damit weiter arbeiten kann.
Wenn ich das wie folgt mache, dann hängt sich die App auf^^
public class MainActivity extends Activity{
public String antwort;
TextView outputStream;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_plot);
private static final String IP = "192.168.178.10";
outputStream = (TextView)findViewById(R.id.output);
antwort = null;
//Initialisieren
socketclient = new SocketClient();
socketclient.execute(IP);
/**** warten bis Socketverbindung steht ****/
int rettich = 0;
while(rettich == 0){// der rettich wird 1, wenn der AsyncTask äuft
if(socketclient.getStatus() == AsyncTask.Status.RUNNING){
socketclient.Send("Wie ist dein Name"); // Befehl der gesendet wird
rettich = 1;
}
}
while(rettich == 1){
if(antwort != null ){
outputStream.setText(antwort);
rettich = 2;
}
}
}
/*********** die Socketverbindung findet in einem AsyncTask statt ***********/
public class SocketClient extends AsyncTask<String, String, Boolean>{
private static final int PORT = 5025;
private static final int timeout = 0;// Timeout ist unendlich
Socket socket;
PrintWriter out;
BufferedReader in;
@Override
protected void onPreExecute(){
// Hier kommt rein, was direkt vor dem Aufbauen der Socket-Verbindung passieren soll
}
@Override
protected Boolean doInBackground(String... ipAdr) {
boolean result = false;
try {
SocketAddress addr = new InetSocketAddress(ipAdr[0],SCR_PORT);
socket = new Socket();
socket.connect( addr, timeout);
if (socket.isConnected()){
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
isReady = true;
while(true){ // InputStream wird dauerhaft ausgelesen, bis AsyncTask gecancelled wird
publishProgress(in.readLine());
}
}else{
Log.v("AsyncTaskError", "socket ist über den Timeout");
}
} catch (UnknownHostException e1) {
e1.printStackTrace();
result = true;
} catch (IOException e1) {
e1.printStackTrace();
result = true;
}catch(Exception e){
e.printStackTrace();
result = true;
}finally{
closeSocket();
}
return result;
}
// Methode schließt die Sockt-Verbindung
public void closeSocket(){
try {
in.close();
out.close();
socket.close();
} catch (IOException e2) {
e2.printStackTrace();
}catch(Exception e2){
e2.printStackTrace();
}
}
// Methode sendet ein Kommando
public void Send(String cmd){
out.println(cmd);//Befehl senden
out.flush();// runterspülen^^
}
// Diese Methode wird immer aufgerufen, wenn ein Input empfangen wird
@Override
public void onProgressUpdate(String... werte){
if (werte.length > 0) {// wenn Daten empfangen wurden
// antwort = werte[0];// Das bringt nichts leider
outputStream.setText(werte[0]);
}
}
// Methode wird aufgerufen, wenn der Task beendet wird
@Override
protected void onCancelled(){
outputStream.setText("Verbindung getrennt!");
}
@Override
protected void onPostExecute(Boolean result) {
if(result){
outputStream.setText("Verbindung beendet mit Fehler!");
}else{
outputStream.setText("Verbindung beendet ohne Fehler!");
}
}
}
}
Bin für jede Hilfe dankbar! Ist nur ein Auszug! (kleine Fehler können sich eingeschlichen haben, bitte nicht beachten)