Android Studio: Methode unterbrechen/ pausieren?

3 Antworten

Vom Fragesteller 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.

4

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
32
@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
4
@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
32
@Jul8910

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

0
4
@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
32
@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
4
@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
32
@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
4
@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
32
@Jul8910

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

0
4
@tavkomann

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

0
32
@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
4
@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
32
@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
4
@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.


4

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

0
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
4
@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.

4

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

0
21

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

0
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
21

Uhh, machst du das spiel Werwölfe? xD

0

[JAVA] Auf eine Methode in einer anderen Klasse zugreifen?

import static java.lang.System.out;
import java.util.Scanner;

public class Datentypen {
@SuppressWarnings("unused")
public static void main(String[] args){
    
    Scanner  keyboard = new Scanner(System.in);
    
    out.println("In Java gibt es viele verschiedene Datentypen. Da ich Ihnen die Unübersichtlichkeit sparen möchte,");
    out.println("habe ich dieses Programm geschrieben. Dieses Programm enthält jeweils ein Beispiel zu je einem Datentypen.");
    out.println("Also, worauf warten Sie? Suchen Sie sich einen Datentypen aus!");
    out.println();
    out.println("Boolean        Char");
    out.println("Byte       Short");
    out.println("Int        Long");
    out.println("Float      Double");
    
    String datentypen  = keyboard.next();
            
    switch(datentypen){
    case "Boolean":
        booleantyp();              //Fehler ist hier!
    }
    }


}

Zweite Klasse:

public class DatentypenMethoden {
public static void maint(String[] args){
    
}

public void booleantyp(){
    
}
}

Wie greife ich jetzt von der Klasse Datentypen auf die Methode "booleantyp()"?

...zur Frage

Wie schreibt man rekursive Funktionen beim Programmieren?

Ich habe ein Problem. Wenn ich eine rekursive Funktion/Methode sehe, dann weiß ich was diese macht, aber andersrum, wenn ich eine rekursive Methode schreiben will, dann bekomme ich es nur im seltensten Fall hin.

Hat jemand Tipps. wie man beim schreiben von rekursiven Funktionen vorgehen kann?

...zur Frage

Beste Methode um Daten von Webseiten auszulesen (Java,Android)?

Hallo ich versuche eine kleine App zu programmieren die den Preis einer Aktie aus dem Internet ausliest und dann in der App angezeigt wird.

Ich kenne folgende Methoden:

  • Html runter laden und mit Pattern und Bufferdreader durchsuchen
  • Xml runter laden und selbes prinzip

Das habe ich aber bisher nur mit normalen desktop programmen gemacht, also noch nicht mit Android.

Irgendwie klappt das bei android nicht so leicht. Bevor ich mich da rein steiger dachte ich mir frag ich erst mal ob das überhaupt die beste Methode ist um Daten auszulesen oder gibt es da alternativen ?

...zur Frage

Methode IOTools.readline Java Eclipse?

Guten Abend.

Ich habe mal wieder eine Frage über Java.

Ich habe ein Programm mit der main-Methode erstellt, einen String.

Dieses:

public class Hello {
  public static void main(String[] args) {
    String name = "Bsp";
    String x = name;
    System.out.println("Hallo " + x + "!");
  }
}

Diesen soll ich jetzt so umändern, dass anstelle der direkten Zuweisung meines Namens, die Variable mit Hilfe der Methode IOTools.readLine den Wert belegt.

Den Anfang habe ich schon gemacht:

import Prog1Tools.IOTools;

public class Hello {
  public static void main(String[] args) {
    IOTools.readLine();

Jedoch weiß ich nicht weiter. Dokumentationen lesen bringt mir da auch nicht viel, leider.

Ich hoffe ich bekomme hier Hilfe.

LG

...zur Frage

Programm läuft nicht in Android Studio?

Hallo,

vor kurzem habe ich in Android Studio ein Programm geschrieben, bei dem man über drei Buttons auswählen kann in welchen Zeitabständen das Handy kurz Vibrieren soll und wie oft sich das ganze Wiederholen soll.

Allerdings ist jetzt das Problem das wenn ich das Programm testen möchte es kurz startet sich aber danach direkt wieder schließt.

Es werden keine Fehler dort angezeigt und Offensichtliche Fehlermeldungen erscheinen auch nicht.

Vielleicht weis ja einer von euch voran es liegen könnte.

Ich schreibe euch den Code mal unten rein.

import android.app.Activity;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import java.util.TimerTask;
import java.util.Timer;

public class MainSignalTimer extends Activity implements View.OnClickListener {

Vibrator vibrieren;

Button button1min;
Button button15min;
Button button45min;
Button buttonstart;
Button buttonstop;

EditText TextFeld1;

int button1;
int wiederholung;

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

    button1min = (Button) findViewById(R.id.button1min);
    button1min.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            button1 = 60000;
        }
    });

    button15min = (Button) findViewById(R.id.button15min);
    button15min.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            button1 = 900000;
        }
    });

    button45min = (Button) findViewById(R.id.button45min);
    button45min.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            button1 = 2700000;
        }
    });

    TextFeld1 = (EditText) findViewById(R.id.editTextWiederholung);

    wiederholung = Integer.parseInt(String.valueOf(TextFeld1));

    buttonstart = (Button) findViewById(R.id.buttonstart);
    buttonstart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {

                    vibrieren = (Vibrator) getSystemService(VIBRATOR_SERVICE);

                    vibrieren.vibrate(250);
                }
            };
            timer.schedule(task, button1, button1);

            int ZumTimerStoppen = wiederholung*button1+10;

            final Timer timer2 = new Timer();
            TimerTask task2 = new TimerTask() {
                @Override
                public void run() {
                    timer.cancel();
                    timer2.cancel();

                }
            };
            timer2.schedule(task2, ZumTimerStoppen);

        }



    });



}



@Override
public void onClick(View v) {

}

}

...zur Frage

Was möchtest Du wissen?