Android Browser startet immer, bevor die Daten dafür geholt wurden

W

Windows10

Bekanntes Mitglied
Java:
private void openInBrowser() {
        getFilmName();
        if (filmname != null) {
            Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
            intent.putExtra(SearchManager.QUERY, filmname);
            startActivity(intent);
        }
    }

    private void getFilmName() {
       Intent intent=new Intent(this, GetFilmActivtiy.class);
       intent.putExtra("list", listToString(getList()));
       startActivityForResult(intent, 3);
    }

    private String listToString(List<Film> list) {
        StringBuilder sb=new StringBuilder();
        for(Film film:list)
        {
            sb.append(film.getName());
            sb.append(",");
        }
        return sb.toString();
    }

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode)
    {
        case 3:
        if(resultCode==RESULT_OK)
        {
            this.filmname=data.getStringExtra("title");
        }
    }
}

 @Override
    public List<Film> getList() {
        return this.masterFragment.getFilmList();
    }

Der Fehler leigt meiner Meinung nach irgendwo in getFilmName(), weil sich der SearchManger (Google Suche) immer startet, bevor getFilmName() fertig ausgeführt wurde. In den anderen Klassen, die ich da benütze und aufrufe liegt kein Fehler.
 
F

fhoffmann

Top Contributor
Zunächst muss ich sagen, dass ich keine Ahnung von Android-Programmierung habe.
Aber folgender Code kommt mir komisch vor:
Java:
private void openInBrowser() {
        getFilmName();
        if (filmname != null) {
Du holst dir also den "filename" (was einen Moment dauern kann) und ohne die Antwort abzuwarten überprüfst du sofort, ob der "filename" gefüllt ist.

Oder anders gesagt: Während "normale" Java-Programme warten, bis eine Funktion, die aufgerufen wurde, fertig ist, hast du es hier mit einem asynchronen Prozess zu tun. Du startest getFileName() und wartest tatsächlich, bis die Anfrage abgeschickt ist. Aber das onActivityResult wird erst später aufgerufen. Da hat deine Überprüfung if (filmname != null) längst false ergeben.
 
sascha-sphw

sascha-sphw

Bekanntes Mitglied
Meiner Meinung nach solltest Du Dir auch angewöhnen Deine Methoden so zu benennen, das klar ist was sie machen. Bei einer Get Methode erwarte ich immer einen return value. Damit wird dann auch schnell klar, dass das in Deinem Fall nicht geht, die Methode besser loadFileName (o.ä.) heißen sollte und man dann das asynchrone verhalten schneller erkennen kann und solche gedanklichen Fehler vielleicht gar nicht erst aufkommen.
 
W

Windows10

Bekanntes Mitglied
Zunächst muss ich sagen, dass ich keine Ahnung von Android-Programmierung habe.
Aber folgender Code kommt mir komisch vor:
Java:
private void openInBrowser() {
        getFilmName();
        if (filmname != null) {
Du holst dir also den "filename" (was einen Moment dauern kann) und ohne die Antwort abzuwarten überprüfst du sofort, ob der "filename" gefüllt ist.

Oder anders gesagt: Während "normale" Java-Programme warten, bis eine Funktion, die aufgerufen wurde, fertig ist, hast du es hier mit einem asynchronen Prozess zu tun. Du startest getFileName() und wartest tatsächlich, bis die Anfrage abgeschickt ist. Aber das onActivityResult wird erst später aufgerufen. Da hat deine Überprüfung if (filmname != null) längst false ergeben.
Ja könnte daran liegen,

Hab aber auch noch was anders gefunden: Im switch fehlt das break.
 
W

Windows10

Bekanntes Mitglied
Meiner Meinung nach solltest Du Dir auch angewöhnen Deine Methoden so zu benennen, das klar ist was sie machen. Bei einer Get Methode erwarte ich immer einen return value. Damit wird dann auch schnell klar, dass das in Deinem Fall nicht geht, die Methode besser loadFileName (o.ä.) heißen sollte und man dann das asynchrone verhalten schneller erkennen kann und solche gedanklichen Fehler vielleicht gar nicht erst aufkommen.
Guter Einwand, werde ich versuchen in Zukunft umzusetzen.

Aber was könnte da der Fehler sein.
Der Vorschlag von @fhoffmann kommt mir schon logisch vor, bin mir aber nicht ganz sicher, aber ist zumindest sehr wahrscheinlich (könnte aber auch am switch ohne break liegen, oder?).
 
sascha-sphw

sascha-sphw

Bekanntes Mitglied
Guter Einwand, werde ich versuchen in Zukunft umzusetzen.

Aber was könnte da der Fehler sein.
Der Vorschlag von @fhoffmann kommt mir schon logisch vor, bin mir aber nicht ganz sicher, aber ist zumindest sehr wahrscheinlich (könnte aber auch am switch ohne break liegen, oder?).
Nein, da danach eh keine Anweisungen mehr kommen, würde das nichts ändern.

Edit: Ein break in einem switch Block, sorgt nur dafür, das nach einem case die darunter liegenden cases nicht auch noch abgearbeitet werden. Sowas ist z.B. ganz praktisch, wenn mehrere cases das selbe bewirken sollen.

Java:
switch(foo) {
    // BAR wie auch FOOBAR würden hier im selben Block landen.
    case BAR:
    case FOOBAR:
        // do something
    break;
    case FOOFOOBAR:
        // do something else
    break;
}
 
W

Windows10

Bekanntes Mitglied
Wie kann ich das jetzt aber beheben, also auf die Antwort warten. Sprich, es soll zuerst das ganze getFilmName ausgeführt werden, bevor ich prüfe, ob der filmName null ist.
 
W

Windows10

Bekanntes Mitglied
Wie kann ich das jetzt aber beheben, also auf die Antwort warten. Sprich, es soll zuerst das ganze getFilmName ausgeführt werden, bevor ich prüfe, ob der filmName null ist. Ich müsste wahrscheinlich irgendwas einbauen, damit es wartet, aber nur wo genau (also innerhalb von getFilmName oder nach getFilmName vor der Überprüfung) und wie (wait(); funktioniert ja nur in einem Thread und habe da keinen Thread).
 
kneitzel

kneitzel

Top Contributor
Also nur mal meine Sichtweise auf diverse Punkte:

a) Ein Switch mit nur einem Case? -> Da wäre ein if eher angebracht. Oder war das nur ein Auszug?

b) Du hast eine Methode, die aufgerufen wird, wenn die Aktion beendet ist (onActivityResult). Also musst Du da lediglich einbauen, was alles gemacht werden soll. Wenn also außer den filename zu setzen noch etwas anderes gemacht werden soll, dann gehört das da rein.

Evtl. reicht es aus, da direkt nach dem setzen des Filenamens den vorhandenen Code einzufügen. Falls das getFilmName an mehreren Stellen genutzt wird und die Folgeaktionen unterschiedlich sind, dann wird evtl. ein Executor als Parameter benötigt, der gespeichert wird und wenn der Aufruf beendet ist, wird da das execute() aufgerufen, um nur eine kleine Idee zu nennen.
 
W

Windows10

Bekanntes Mitglied
Also nur mal meine Sichtweise auf diverse Punkte:

a) Ein Switch mit nur einem Case? -> Da wäre ein if eher angebracht. Oder war das nur ein Auszug?

b) Du hast eine Methode, die aufgerufen wird, wenn die Aktion beendet ist (onActivityResult). Also musst Du da lediglich einbauen, was alles gemacht werden soll. Wenn also außer den filename zu setzen noch etwas anderes gemacht werden soll, dann gehört das da rein.

Evtl. reicht es aus, da direkt nach dem setzen des Filenamens den vorhandenen Code einzufügen. Falls das getFilmName an mehreren Stellen genutzt wird und die Folgeaktionen unterschiedlich sind, dann wird evtl. ein Executor als Parameter benötigt, der gespeichert wird und wenn der Aufruf beendet ist, wird da das execute() aufgerufen, um nur eine kleine Idee zu nennen.
a) War nur ein Auszug (habe gerade den Code vor mir und es gerade bemerkt, dass es ein Auszug war)
b) hätte ich bereits so gemacht

Was meinst du damit? Was soll ich machen, damit es funktioniert?
 
kneitzel

kneitzel

Top Contributor
Was ich meinte wäre sowas in der Art:

Code:
private void openInBrowser() {
        getFilmName();
        // Hier nichts mehr!
    }

    private void getFilmName() {
       Intent intent=new Intent(this, GetFilmActivtiy.class);
       intent.putExtra("list", listToString(getList()));
       startActivityForResult(intent, 3);
    }

    private String listToString(List<Film> list) {
        StringBuilder sb=new StringBuilder();
        for(Film film:list)
        {
            sb.append(film.getName());
            sb.append(",");
        }
        return sb.toString();
    }

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode)
    {
        case 3:
        if(resultCode==RESULT_OK)
        {
            this.filmname=data.getStringExtra("title");
            // Hier dann der Code, der gemacht werden soll nachdem der Filmname geholt wurde ...
            if (filmname != null) {
                Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
                intent.putExtra(SearchManager.QUERY, filmname);
                startActivity(intent);
            }
        }
    }
}

Aber so Änderungen sind ohne kompletten Code immer schwer zu machen. Hier im Forum kann man mit Copy & Paste schnell Syntax Fehler machen und so ...
 
W

Windows10

Bekanntes Mitglied
Also der Code, den ich nach getFilmName() habe in die onActivityResult() verschieben?
 
kneitzel

kneitzel

Top Contributor
Ja, so in der Art. Das war, was ich meinte, aber was die Nutzbarkeit ggf. Zu sehr einschränkt, weshalb ich auch erwähnt habe, wie man es universeller machen könnte....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Android App - Browser öffnen und Text eingeben/Button click auslösen Android & Cross-Platform Mobile Apps 10
S Android Welchen Browser ruft WebView auf? Android & Cross-Platform Mobile Apps 3
A Android Browser öffnen, XML-GUI-Layout Android & Cross-Platform Mobile Apps 23
P FireFox Browser aufrufen Android & Cross-Platform Mobile Apps 2
jmar83 Android Warum muss man bei Android Studio immer 2x auf "Run" klicken damit die App auf dem Gerät startet Android & Cross-Platform Mobile Apps 8
T Android SDK-Manager startet nicht in Eclipse Android & Cross-Platform Mobile Apps 5
J Firebase und Emulator startet nicht Android & Cross-Platform Mobile Apps 2
S Android Emulator startet nicht vollständig. Android & Cross-Platform Mobile Apps 0
M Android App startet nach Tastensperre neu Android & Cross-Platform Mobile Apps 3
D Android App startet nicht Android & Cross-Platform Mobile Apps 24
Kidao Wie startet man ein Thread richtig? Android & Cross-Platform Mobile Apps 4
C SQLite Datenbank in Kotlin - App stürtzt immer ab Android & Cross-Platform Mobile Apps 0
TheWhiteShadow Android Class.getResource immer null Android & Cross-Platform Mobile Apps 6
R Android incomingNumber bein Eingehenden Anruf immer leerer String Android & Cross-Platform Mobile Apps 4
N Android tabhost: immer nur tab1 sichtbar Android & Cross-Platform Mobile Apps 4
K Zeitstopp-App, immer dann aktiv, wenn Handy an - wie vorgehen? Android & Cross-Platform Mobile Apps 4
N Android bei textview.settext immer abbruch Android & Cross-Platform Mobile Apps 4
N Textview macht immer nach einem Beistrich einen Abstand Android & Cross-Platform Mobile Apps 6
X AVD stüzt immer ab Android & Cross-Platform Mobile Apps 6
D Java ME Mehrere Random´s geben immer die gleiche Zahl zurück Android & Cross-Platform Mobile Apps 7
D Hashtable/Vector - immer nur letzter Eintrag vorhanden Android & Cross-Platform Mobile Apps 6
Kidao InputStream.available() liefer immer nur 0 Android & Cross-Platform Mobile Apps 8
G Randomgenerator liefert immer wieder die selben Zahlen Android & Cross-Platform Mobile Apps 16

Ähnliche Java Themen

Anzeige

Neue Themen


Oben