Android TCP Socket

  • Antworten:4
  • Bentwortet
Tobias Tress
  • Forum-Beiträge: 9

11.03.2021, 16:08:44 via Website

Hi Leute,

Ich hab ein Problem mit dem Android TCP Socket. Und zwar wenn ich die Void akt() zum ersten mal ausführe funktioniert alles super. Jedoch sobald die Void akt() ein weiteres mal ausführe bleibt er in der "do while" Schleife hängen.

public class Bildschirm extends AppCompatActivity {

Button but1,but2;
ListView list1;


String bestellungen[] = new String[0];
String tischnummern[] = new String[0];
int id[] = new int[0];
boolean fertig = false;
String rueck = "-1";
Thread th = new Thread();
CustomAdapter customAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_bildschirm);

    th = new Thread();

    but1 = (Button) findViewById(R.id.bildbut1);
    but2 = (Button) findViewById(R.id.bildbut2);
    list1 = (ListView) findViewById(R.id.bildlist1);

    but2.setText(Sprache.Aktualisieren[Variablen.Sprache]);

    akt();

}

public void akt ()
{

    rueck = "-1";
    fertig = false;
    boolean test = false;
    String sende = "";
    for(int i = 0;i<ausge.length;i++)
    {
        if(ausge[i] == true)
        {
            sende = sende + "%" + i + "=1";
        }else
        {
            sende = sende + "%" + i + "=0";
        }
    }

    th = new Thread (new Thread1(sende));
    th.start();

    /* Fehler !
    while (fertig == false)
    {
    }
    */
    do {
        test = fertig;

    }while (test == false);
    if(rueck.equals("!"))
    {
        bestellungen = new String[0];
        tischnummern = new String[0];
        id = new int[0];
    }else {
        String Daten[] = rueck.split("%");

        bestellungen = new String[Daten.length];
        tischnummern = new String[Daten.length];
        id = new int[Daten.length];

        for (int i = 0; i < Daten.length; i++) {
            String werte[] = Daten[i].split("/");
            if (werte.length == 3) {
                bestellungen[i] = werte[0];
                tischnummern[i] = werte[1];
                id[i] = Integer.parseInt(werte[2]);
            }
        }
    }
    customAdapter = null;
    customAdapter = new CustomAdapter(getApplicationContext(),bestellungen,tischnummern);
    list1.setAdapter(customAdapter);
}

public void Aktualisieren (View view)
{
    akt();
}


private PrintWriter output;
private BufferedReader input;

class Thread1 implements Runnable {
    private String message;
    Thread1(String message) {
        this.message = message;
    }
    @Override
    public void run() {
        Socket socket;
        fertig = false;
        try {
            rueck = "-1";

            socket = new Socket(Variablen.IP, Variablen.PORT);
            output = new PrintWriter(socket.getOutputStream());
            output.write(message);
            output.flush();
            input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            rueck = input.readLine();
            fertig = true;
            input.close();
            output.close();
            /*
            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    //etMessage.setText("");
                }
            });
            */
            socket.close();

        } catch (IOException e) {
            fertig = true;
            e.printStackTrace();
        }

    }

}

}

Ich hab schon verschiedenes Probiert jedoch ohne Erfolg. Die "do while" Schleife benötige ich um so lange zu warten bis ich einen Rückgabewert vom Server erhalten habe.
Zur Info: Beim zweiten Aufruf sendet er alles richtig an den Server und der Server sendet auch eine Richtige Antwort an den Android Client.

Ich danke schon jetzt für hilfreiche Antworten.
Gruß Tobias

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.527

15.03.2021, 21:09:37 via Website

Hallo ich würde die Kommunikation zwischen Thread und Activity mit einen Handler machen.
Da sparst du dir auch deine Do While Schleife und der Handler läuft im UI Thread.

https://sodocumentation.net/android/topic/1425/handler
https://developer.android.com/reference/android/os/Handler

— geändert am 15.03.2021, 21:19:23

Hilfreich?
Tobias Tress
Kommentieren
swa00
  • Forum-Beiträge: 3.704

11.03.2021, 17:13:18 via Website

Hallo Tobias ,

dein Code ähnelt eher einem C/C++ daemon code, das kannst du so unter Android nicht machen.

Zumal du in deinen while Schleifen auch der UI keine Luft lässt.
(Das würde auch unter C schief gehen)

Des Weiteren rufst du im Thread UI Elemente auf, die eigentlich in einen UI-Runnable gehören .

Deine gesamte Mimik sollte unter Android eher mehr Asynchron aufgebaut sein und
mit Callback-Listener arbeiten .

— geändert am 11.03.2021, 17:15:17

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren
Tobias Tress
  • Forum-Beiträge: 9

11.03.2021, 19:21:21 via Website

Hi swa00,

Danke für deine Schnelle Antwort. Könntest du mir erklären/ zeigen wie ich hier einen Callback-Listener einbringen kann?

Gruß

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

15.03.2021, 06:29:41 via Website

Das Stichwort ist OOP.
https://de.wikipedia.org/wiki/Objektorientierte_Programmierung#:~:text=Die%20objektorientierte%20Programmierung%20(kurz%20OOP,der%20die%20gegebene%20Anwendung%20betrifft.

Du lagerst Dir deine Verbindungen in eine eigene Klasse aus , bildest daraus jeweils eine Instanz und lieferst an die MaintActivity deine Callbacks.

— geändert am 15.03.2021, 06:35:01

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.527

15.03.2021, 21:09:37 via Website

Hallo ich würde die Kommunikation zwischen Thread und Activity mit einen Handler machen.
Da sparst du dir auch deine Do While Schleife und der Handler läuft im UI Thread.

https://sodocumentation.net/android/topic/1425/handler
https://developer.android.com/reference/android/os/Handler

— geändert am 15.03.2021, 21:19:23

Hilfreich?
Tobias Tress
Kommentieren