Threads HTTP Request (Thread) dauert lange - in Android

julianpe

Aktives Mitglied
Hallo zusammen,

Ich hoffe ich darf um Eure Hilfe bitten bezüglich einer Frage der Android Programmierung.
Im Kern geht es natürlich um Java und seine Threads.

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?




Java:
// 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..
        }
    }
 
HTTP ist gänzlich ungeeignet für solche Realtime Aktionen. Dafür ist es halt einfach viel zu langsam. Wieso must du ständig ein move forwaard schicken? Kann man dem Arduino nicht sagen er soll solange forwärts fahren bis er einen stop bekommt?

Gruß

Claus
 
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();

Ich weiss nicht genau wie dieser OnTouchListener in Android funktioniert aber erzeugst du damit nicht ständig neue Threads solange der Button gedrückt ist ?
 

Zurück
Oben