Warten auf Serverantwort

  • 2 Antworten
  • Neuester Beitrag
Diskutiere Warten auf Serverantwort im Android App Entwicklung im Bereich Betriebssysteme & Apps.
D

DMD-OL

Neues Mitglied
hi
ich habe eine app geschrieben, mit der ich daten an meinen rechner verschicken kann.
der server läuft auf meinem pc und sendet dem handy einen antwortstring zurück.
der antwortstring ist z.B. "Alles ok", "Falscher Name", usw.
wie kann ich dem handy nun vermitteln, daß es warten soll, bis es eine solche antwort vom server (callback glaub ich) zurückbekommt?
in meinem codeschnippsel ist das bisher noch gar nicht drin, da ich nicht weiß,
ob ich ein neues interface aufmachen soll, oder einfach eine while (true) -schleife einbauen muß, oder, oder....
hier mein code:
Code:
    @Override
    protected Void doInBackground(Void... arg0) {

        JSONArray arb_List = new JSONArray();
        JSONArray mat_List = new JSONArray();

        Cursor arb_Cursor = My_Database.getAllData();

        if (arb_Cursor.getCount() == 0){

            Intent click_datenbank = new Intent(daten_transfer.this,pop_datenbank.class);
            startActivity(click_datenbank);

        }else {

            Socket socket = null;

            try {

                SocketAddress sock_addresse = new InetSocketAddress(dstAddress, dstPort);
                socket = new Socket();
                socket.connect(sock_addresse, timeoutMs);

                SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
                String dateTime = sdf.format(new Date());

                //Servernamen empfangen
                ByteArrayOutputStream bAPS_Name = new ByteArrayOutputStream(1024);
                byte[] bytes_Name = new byte[1024];
                int int_server;
                InputStream input_Name = socket.getInputStream();
                int_server = input_Name.read(bytes_Name);
                bAPS_Name.write(bytes_Name, 0, int_server);
                response += bAPS_Name.toString("UTF-8");

                //Datenbank auslesen und in Liste dat_List schreiben
                [....]
             
                //Senden
                JSONObject json = new JSONObject();

                try (OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)){

                    json.put("User",userName);
                    json.put("Datetime",dateTime);
                    json.put("Datenliste",dat_List);
                    writer.write(json.toString());
                    writer.close();

                } catch (JSONException e) {
                    e.printStackTrace();
                    failMessage = "SORRY, IRGENDETWAS IST SCHIEFGEGANGEN...:\n" + e.toString();
                }
                 //#####################
                 //hier versuche ich eine while-schleife einzubauen
                 //#####################

            } catch (UnknownHostException e) {
                e.printStackTrace();
                failMessage = "IP-ADRESSE UNBEKANNT:\n" + e.toString();

            } catch (IOException e) {
                e.printStackTrace();
                failMessage = "PC NICHT ERREICHBAR:\n"+ e.toString();
            }finally{
                if(socket != null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                        failMessage = "IO-Exception:\n" + e.toString();
                    }
                }
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        if (failMessage.length()!= 0){
            Toast.makeText(daten_transfer.this,failMessage,Toast.LENGTH_LONG).show();
            //Intent click_transfer = new Intent(daten_transfer.this,pop_wlan.class);
            //startActivity(click_transfer);
        }
        else{
            SharedPreferences systemDATA = getSharedPreferences("konto",0);
            SharedPreferences.Editor editor = systemDATA.edit();
            //editor.putString("failmessage",failMessage);
            //editor.commit();
            editor.putString("response",response);
            editor.commit();

            if (response.length() != 0){
                Intent click_transfer = new Intent(daten_transfer.this,pop_tansfer.class);
                startActivity(click_transfer);
            }

            textView_show.setText(message);
        }
    }
}
falls nötig, stell ich auch den gesamten code rein.
kann mir da jemand auf die sprünge helfen?
 
Zuletzt bearbeitet:
swa00

swa00

Moderator
Teammitglied
Hallo DMD-OL

den gesamten Code lass mal lieber sein, sonst muss man ja noch mehr lesen , was für dein Problem nicht relevant wäre :)

Was ich sehen konnte :
Du bastelst dir einen JSON und schickst den weg und dann willst du auf das Response des Servers warten - richtig ??

Sollte das so sein , steht dem nichts im Wege eine while schleife einzubauen (readln)
bei der du den simplen String ,der vom Server kommt auswertest und dann aus doInBackground rausspringst.
readln blockiert so lange, solange nix zu zurückkommt BLOCK_FREE gibt leider nicht ... (IO_CTL)

Allerdings ein Tip an Dich ...
Ich würde für deinen Fall eher OkHttp oder ION nehmen, da bekommst du wunderschöne Callbacks zurück.
Diese berücksichtigen auch alle erdenklichen Unannehmlichkeiten, denen du begegnen kannst.

Fürs Lernen war dein Beispiel für dich sicherlich wertvoll :)
 
D

DMD-OL

Neues Mitglied
allerdings.
danke für deine antwort und ja, json komplett raus, dann kontrolliert server, ob er alles vollständig verarbeiten kann und soll
dann eine dementsprechende antwort als string ans handy zurückgeben.
nur hab ich nach dem //Senden schon einmal versucht eine while-schleife einzubauen...
Code:
//Senden
JSONObject json = new JSONObject();

try (OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)){

    json.put("User",userName);
    json.put("Datetime",dateTime);
    json.put("Arbeitsliste",arb_List);
    json.put("Materialliste",mat_List);
    writer.write(json.toString());
    writer.close();

} catch (JSONException e) {
    e.printStackTrace();
    failMessage = "SORRY, IRGENDETWAS IST SCHIEFGEGANGEN...:\n" + e.toString();
}

//Serverantwort empfangen
InputStream input_Response = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(input_Response));
String line = "";
while ((line = br.readLine()) != null) {
    message = line;
}
dabei ist mir fast der rechner explodiert, so falsch wie das anscheinend war :)
naja, eigentlich gibt es die ausnahme:
PC NICHT ERREICHBAR: Java.net.SocketException: socket is closed
ist das überhaupt die richtige stelle, in der ich das versuche einzubinden und wenn ja,
wie wird das korrekt gemacht (gerne auch mit der OkHttp- oder ION-Methode).
es soll erst einmal nur funktionieren, das wär schön.
lg chrissimaus
 
Zuletzt bearbeitet: