Methode regelmäßig aufrufen

  • Antworten:5
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 28

23.10.2018, 16:12:21 via Website

Hallo
Ich habe bei Google gesucht, wie ich eine Methode in Android regelmäßig aufrufen kann. Leider habe ich dazu nichts richtiges gefunden. Wie kann ich das machen? Wenn sie aufgerufen wird, möchte ich vom arduino über bluetooth daten empfangen.
Das funktioniert in etwa so:

public void empfangen() {
        byte[] buffer = new byte[1024]; // Puffer
        int laenge; // Anzahl empf. Bytes
        String msg = "";
        try {
            if (globaleVariablen.getStream_in().available() > 0) {
                laenge = globaleVariablen.getStream_in().read(buffer);
                Log.d(LOG_TAG,
                        "Anzahl empfangender Bytes: " + String.valueOf(laenge));

                // Message zusammensetzen:
                for (int i = 0; i < laenge; i++)
                    msg += (char) buffer[i];

                Log.d(LOG_TAG, "Message: " + msg);
                Toast.makeText(this, msg, Toast.LENGTH_LONG).show();

            } else
                Toast.makeText(this, "Nichts empfangen", Toast.LENGTH_LONG)
                        .show();
        } catch (Exception e) {
            Log.e(LOG_TAG, "Fehler beim Empfangen: " + e.toString());
        }
    }
Diskutiere mit!
  • Forum-Beiträge: 2.901

23.10.2018, 17:08:28 via Website

Dazu verwendest du einen Thread.
https://developer.android.com/guide/components/processes-and-threads

Wenn er zeitlich begrenzt ist , dann mit einem AsyncTask.
https://developer.android.com/reference/android/os/AsyncTask

Dein code beinhaltet keine Fehlerbehandlung (try/catch) - Der wäre an der Stelle eigentlich
zwingend notwendig.

Anmerkung : Das wird aber gar nicht so Programmiert.
Erstelle einen Thread, der deinen IN-Buffer nach Daten abfragt (read) und reagiere dann auf die Bytes.
Beende diesen Thread erst dann, wenn deine BT Verbindung auch geschlossen wird.

— geändert am 23.10.2018, 17:45:04

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

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 28

23.10.2018, 18:01:11 via Website

Sollte es dann so aussehen oder habe ich da etwas falsch verstanden?

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new Runnable() {
            public void run() {
                empfangen();
            }
        }).start();

— geändert am 23.10.2018, 18:02:18

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.165

23.10.2018, 18:38:01 via App

Schon richtig verstanden, allerdings brauchst du zur Datenausgabe/Toast einen Callback in den MainThread sonst geht was schief...
Und immer gegenchecken dass dein Thread auch läuft und nicht beendet wird.
Zudem auch das Lifecycle Management wenn App im Hintergrund und wieder geöffnet etc.
Das ist leider mit dem paar Zeilen nur der Anfang.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 28

23.10.2018, 19:43:19 via Website

allerdings brauchst du zur Datenausgabe/Toast einen Callback in den MainThread

Was genau meinst du damit? Was muss ich da in meine Code schreiben?

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 28

07.11.2018, 18:44:07 via Website

Danke! ich habe es mit einem Thread hinbekommen.

— geändert am 07.11.2018, 18:52:21

Hilfreich?
Diskutiere mit!

Empfohlene Artikel