Android Studio: Methode unterbrechen/ pausieren?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Wenn du möchtest, dass die Methode nicht mehr aufgerufen werden kann:

https://pastebin.com/bYR82AMX

Wenn du sie abrupt beenden willst, erstelle einen eigenen Thread und beende diesen.


Jul8910 
Beitragsersteller
 30.08.2017, 18:04

Erstmal Vielen Dank für Deine Antwort.

Ich habe den Pastebin von dir übernommen. Nun ist aber ein Problem da.

Das Ziel meiner Frage war es ja, dass der Nutzer die Einführung [einfuehrung()] startet. Nun sollte er es aber auch überspringen können. Mit dem von Dir geschickten Code jedoch, gibt es nur eine Möglichkeit, nämlich diese: den Button [btnstartespiel] zu betätigen und den ganzen Text ablaufen lassen.

Kannst du mir da weiterhelfen? Für Fragen bin ich natürlich offen :)

0
tavkomann  30.08.2017, 18:52
@Jul8910

Wie sieht denn die Einführung aus? Also ich mein jetzt nicht den Code, sondern was wird dort gemacht? Abwechselnd Texte angezeigt? Dann könnte man in der Funktion vor jedem neuen Text überprüfen, ob nicht bereits übersprungen wurde. Den aktuellen Text würde man einfach ausblenden.

0
Jul8910 
Beitragsersteller
 30.08.2017, 19:07
@tavkomann

Die Einführung besteht aus drei Methoden. Da der Text der Einführung zu lang war, habe ich ihn in drei Abschnitte gepackt. In den drei Methoden wird ein Text per TextView angezeigt und per tts ausgegeben.

0
tavkomann  30.08.2017, 19:18
@Jul8910

Ok, du kannst die TTS mit der Methode tts.stop() abbrechen. Ansonsten beachte das, was ich oben schrieb.

0
Jul8910 
Beitragsersteller
 30.08.2017, 19:23
@tavkomann

Das mit dem tts.stop() habe ich bereits schon verwendet. Jedoch wurde dadurch nur das TTS unterbrochen und der Text trotzdem gezeigt.

Ansonsten beachte das, was ich oben schrieb.

Das heißt ich soll das mit dem Thread verwenden? 

0
tavkomann  30.08.2017, 19:49
@Jul8910

Ich meinte das:

Dann könnte man in der Funktion vor jedem neuen Text überprüfen, ob nicht bereits übersprungen wurde. Den aktuellen Text würde man einfach ausblenden.

Nur das man nicht den Text ausblendet, sondern die TTS abbricht. D.h. also, du setzt eine Variable auf false, die vorher true ist. In deiner Einführungs-Methode fragst du dann vor jeder neuen TTS ab, ob dieser Wert true ist und führst es nur dann aus.

0
Jul8910 
Beitragsersteller
 30.08.2017, 19:51
@tavkomann

Korrekt, dann kann ich jedoch nur nach jedem Drittel des Vollen Textes überprüfen und eventuell wird dann noch der Textabsatz ausgeführt. Hab ich Recht?

0
tavkomann  30.08.2017, 19:59
@Jul8910

Achso. Ich habe es überlesen. Du kannst einfach den Text ebenfalls entfernen, wenn du auch die TTS stoppst. Mit den Variablen sorgst du nur dafür, dass kein neuer Text erzeugt wird.

1
Jul8910 
Beitragsersteller
 30.08.2017, 20:25
@tavkomann

Ich habe es jetzt so hinbekommen, dass bei jeder "Teilmethode" also z.B. [einfuehrung1()] geprüft wird, ob es überspringen soll.

Es ist nun eben noch so, dass wenn ich bei [einfuehrung1()] auf den Screen klicke, dass dann noch [einfuehrung1()] voll fertig gemacht wird, bis dann bei [einfuehrung2()] die Variable auf true geprüft wird und es dann überspringt.

Nun wäre meine Frage, ob es sinnvoll wäre die Variable per Handler jede Sekunde auf true zu prüfen? Oder habe ich etwas nicht beachtet?

0
tavkomann  30.08.2017, 20:36
@Jul8910

Ein Handler kann in diesem Fall sinnvoll sein. Schick doch einfach eine Nachricht per Handler, wozu jede Sekunde überprüfen?

0
Jul8910 
Beitragsersteller
 30.08.2017, 20:38
@tavkomann

Also ich meinte jede Sekunde (oder eben in anderen Zeitabständen) prüfen, ob der Nutzer inzwischen auf den Screen geklickt hat. 

0
tavkomann  30.08.2017, 20:57
@Jul8910

Das ist ja nicht erforderlich, wenn du einen Handler nutzt. Das funktioniert so:

private Handler handler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
// Der Code zum Entfernen der Nachricht // und Abbrechen der TTS
} };

Diesen Handler musst du auf irgendeinem Wege zu der Klasse bringen, in der der Text gesteuert wird. Die Methode kannst du dann mit

handler.sendEmptyMessage(1);

zum Aufrufen bringen.

Wenn beides in der selben Klasse ist, also die Methode, in der die Variable gesetzt wird Zugriff hat, dann brauchst du keinen Handler, sondern kannst das alles gleichzeitig mit dem Setzen der Variable tun.

0
Jul8910 
Beitragsersteller
 30.08.2017, 21:21
@tavkomann

Könntest Du das bitte noch ein wenig genauer erklären. Wo genau muss ich den Handler einbauen?  Wie Du weißt habe ich noch nicht viel Erfahrung (schon gar nicht mit dem Handler). Vielen Dank für Dein Verständnis :)

0
tavkomann  30.08.2017, 22:13
@Jul8910

Ich habe mir deinen Code angesehen. Du brauchst, glaube ich, keinen Handler. Du kannst direkt dort, wo du die Variable auf false setzt, auch den Text entfernen und TTS stoppen, oder nicht?

1
Jul8910 
Beitragsersteller
 31.08.2017, 13:34
@tavkomann

Habe es jetzt geschafft. Funktioniert. Vielen Dank! 

1

Das geht nicht und ergibt auch keinen Sinn. Methoden laufen ja nicht "der Reihe nach" ab. Es würde also zu unvorhersehbaren Ergebnissen führen.

Was man machen kann, ist, dass man bei Multi-Thread-Aufgaben den entsprechenden Vorgang unterbricht. Ein guter Weg dafür ist, eine volatile-Variable zu machen und diese vor Beginn des Threads auf "false" zu setzen, durch einen Tap auf den Bildschirm auf "true" und dann im Ablauf des Threads immer wieder zu prüfen, ob die Variable "true" ist und ggf. die Thread-Methode zu verlassen.

Theoretisch kann man natürlich das oben gesagte für jede Methode machen. Aber wie gesagt: Das ergibt keinen Sinn.



Jul8910 
Beitragsersteller
 30.08.2017, 14:32

Dankeschön. Wie würdest du das ganze lösen? Tatsächlich so wie beschrieben? 

0
ohwehohach  30.08.2017, 14:41
@Jul8910

Das was Du beschreibst passt aber gar nicht zu Deinem Pastebin-Code. Was dort steht ist ja ein ganz normaler Methodenaufruf. Das heißt: Wenn der Button gedrückt wird, wird der event handler ausgeführt. Fertig. Läuft so.

Du müsstest ja dann nicht nur eigene Methoden unterbrechen, sondern ggf. auch Framework-Methoden. Das geht nicht. Vertraue einfach darauf, dass schon alles schnell genug geht (bzw. programmiere es dementsprechend :-)).

0
Jul8910 
Beitragsersteller
 30.08.2017, 14:56
@ohwehohach

Hast Recht...habe in den Pastebin nicht alles reingepackt :(

0

Du kannst dein ganzes layout in eine variable speichern. Dann mit einem onclicklistener arbeiten.


pixelino  30.08.2017, 14:52

Uhh, machst du das spiel Werwölfe? xD

0
pixelino  30.08.2017, 14:31

mit ein bisschen code wäre es leichter. Mach mal einen hastebin link ^^

0
ohwehohach  30.08.2017, 14:41
@Jul8910

Der Code passt aber so gar nicht zur Frage... Das ist ein ganz normaler Event. Das heißt, wenn geklickt wird, wird die Methode dorfschlaeftein() aufgerufen. Das funktioniert so. Fertig.

1
Jul8910 
Beitragsersteller
 30.08.2017, 14:30

Vielen Dank. Das habe ich bereits. Wie aber kann ich eine Methode stoppen?

0