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?
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..
}
}