HTTP Request ist langsam im Thread

  • 1 Antworten
  • Letztes Antwortdatum
J

jolle-pe

Ambitioniertes Mitglied
4
Hallo,

ich programmiere gerade eine App mit folgender Funktionalität.
Ich möchte mittels Tastendruck einen HTTP Request erzeugen, der meinem Arduino somit einen Befehl sendet.
Letzter funktionsfähiger Stand war, dass ich einen Button mit einem onClickListener hatte.
Sobald der Button betätigt wurde, wurde eine HTTP Request Funktion mittels Thread gestartet.
Das hat soweit alles sehr schnell funktioniert.

Nun wollte ich gerne, dass eine Methode moveForward(); solange läuft, wie ich den Button betätigt lasse.
Sobald ich den Button wieder los lasse, soll eine Funktion moveStop(); einmalig ausgeführt werden.
Momentan ist es so, dass die Anforderungen an den Arduino raus gehen, jedoch aber mit einem relativ langen (2 Sekeunden) Verzug.

Hier ist mein aktueller, langsamer Code (stark minimiert):
Hat jemand eine Idee wo die Bremse lauert?

Code:
// Button onTouch Listener
// Funktionalität:
// Bei Tastendruck wird der moveForward() Befehl ausgeführt
// sobald die Taste losgelassen wird, wird der moveStop() Befehl ausgeführt


btnForward.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View view, MotionEvent event) {
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {

                    buttonStatusVoraus = true;

                    new Thread(new Runnable() {
                        public void run() {
                            while (buttonStatusVoraus) {
                                try {
                                    if (bConnected == true) {
                                        moveForward();
                                        Log.d("Touch Voraus", "Kommando voraus");
                                        Thread.sleep(iSleepTime);
                                    }else{
                                        Log.d("Touch Voraus", "Nicht verbunden");
                                    }
                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                        }
                    }).start();

                    if (bConnected == true) {
                          showSnackBar("Kommando: voraus aktiv");
                    }else{
                        showSnackBar(StrNotConnected);
                    }
                } else if (event.getAction() == android.view.MotionEvent.ACTION_UP) {
                    buttonStatusVoraus=false;
                    if (bConnected == true) {
                        try {
                            moveStop();
                            Log.d("Touch Voraus", "Kommando stop");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        showSnackBar("Kommando: Stop");
                    }
                }
                return true;
            }
        });
       
   
    // Methode generiert HTTP Anforderung
    // Bspw: http://192.168.1.15/manual?mode=2
    // Anschließend wird Thread gestartet
   
    public void moveForward() throws Exception {
        ActionString = "http://" + StrIPAdress + "/manual?mode=2";
        new RequestTask().execute();
    }
   
   
    // Thread für HTTP Request Handling
   
     class RequestTask extends AsyncTask<String, String, String> {

        @Override
        protected String doInBackground(String... uri) {
            String responseString = null;
            try {
                URL url = new URL(ActionString);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                if (conn.getResponseCode() == HttpsURLConnection.HTTP_OK) {
                    // Do normal input or output stream reading
                } else {
                    //response = "FAILED"; // See documentation for more info on response handling
                }
            } catch (IOException e) {
                //TODO Handle problems..
            }
            return responseString;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            //Do anything with response..
        }
    }
 
a) Ein Verbindungsaufbau kann schon etwas dauern.

b) Einen Thread in einen Listener zu starten, ist keine wirklich gute Idee. Insbesondere, wenn der Thread eine anonyme Klasse ist.
Jedes mal, wenn der Listener ausgelöst (ACTION_DOWN) startet dein Anwendung ein Thread.
Und die App baut eine Verbindung zu deinem Arduino auf. Wenn der Spieler kein ACTION_UP auslöst, können sehr viele Netzwerkverbindungen aufgebaut werden. Die alle hintereinander abgearbeitet werden (Dein WIFI arbeitet nicht parallel). Das verzögert die Datenübertragung.

Damit fangen aber die Probleme erst an. Die offenen Verbindung werden nicht wieder geschlossen (conn.disconnect()). Nicht geschlossene Streams, die nicht mehr gebraucht werden (und auf die keine Referenzen mehr existieren), erzeugen Memory Leaks.
Sprich der GC kann den Speicher nicht mehr leer räumen.
Dein Thread (nicht dein Task) hat noch ein Problem. Er wird nicht beendet, wenn die Activity kurzfristig beendet wird (z.B Telefonanruf).

Am besten du schaust dir das Thema "Thread" genauer an, und baust Deinen Code um.

Android App Programmieren
 
Zurück
Oben Unten