Return String funktioniert zeitverzögert

  • 9 Antworten
  • Neuster Beitrag
kukuk

kukuk

App-Anbieter (kostenlos)
Threadstarter
Hallo zusammen,

ich habe da mal wieder eine kuriosität gefunden und benötige dafür eine Lösung.

Wenn ich den Textbox Inhalt einer Webseite auslese funktioniert dies zwar, allerdings zeitverzögert.

Wenn ich den unten gelisteten Code verwende und in OnReceiveValue eine Toast einbaue wird mir

der variablen Inhalt korrekt angezeigt.

Rufe ich die Funktion jetzt ganz normal auf, String wert_auslesen = read_html_value("response");
und versuche diesen Wert dann zu lessen ist dieser immer Null.

Setze ich in der Funktion vor dem return eine Toastmeldung, ist der Wert var[0] auch immer null.

Ich müsste jetzt in der onReceiveValue das return var[0] verwenden. Da zeigt mir AS allerdings ein Fehler an.

Oder aber gibt es einen isEmpty waiter?

Sobald der String nicht mehr Null ist, wird erst weitergearbeitet?

Wie komme ich da weiter?





Code:
public String read_html_value(String control){

    final String[] var = {""};
    wv.evaluateJavascript(
            "(function() { return (document.getElementsByName('" + control + "')[0].value); })();",
            new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String html) {
                   var[0] = html;
                    // code here

                }
            });


return var[0]
}



Ich bräuchte sowas:

Code:
public String read_html_value(String control){

    final String[] var = {""};
    wv.evaluateJavascript(
            "(function() { return (document.getElementsByName('" + control + "')[0].value); })();",
            new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String html) {
                   var[0] = html;
                  return var[0];

                }
            });


}
 
Zuletzt bearbeitet:
numanoid

numanoid

Stammgast
Was ich so über die webview.evaluateJavascript() gelesen habe, sollte man diese in einem 'Background' Thread laufen lassen, weil man nie wissen kann, wie lange die Verarbeitung dauern wird. Sonst kann es zu einer ANR führen.

Ausserdem kann man auf Variablen der aufrufenden Methode nicht im Callback zugreifen.

Das Ganze ist also etwas kniffliger, und ich habe durch 'googlen', keinen einzigen Thread gefunden, wo jemand dieses Thema lösen konnte.
 
swa00

swa00

Moderator
Teammitglied
@kukuk

Und warum wendest du nicht JSoup an ?
Oder wartest bis ION / OKHttp und Konsorten in einem Callback-Listener fertig sind ?
 
Zuletzt bearbeitet:
kukuk

kukuk

App-Anbieter (kostenlos)
Threadstarter
@swa00: lässt sich das denn in einer Public String Funktion mit Return String realisieren?
 
swa00

swa00

Moderator
Teammitglied
Du möchtest doch aus einem html Inhalt einen bestimmten Bereich/Wert ermitteln,
oder habe ich das falsch verstanden ?.

Warum machst du es dann so kompliziert/unsicher ?
Nimm eine Standard-Library, requeste die Seite , warte bis der Callback zurück kommt und
parse dann.

Oder nimm direkt jsoup
Load a Document from a URL: jsoup Java HTML parser
 
Zuletzt bearbeitet:
kukuk

kukuk

App-Anbieter (kostenlos)
Threadstarter
Ja, dass hast du richtig verstanden.

Ich finde, dass was du schreibst hört sich mega kompliziert an und dann müsste ich noch Bibliotheken einbinden usw. :1f606:

Also gibt es keine Möglichkeit das return String an einer anderen Stelle zu setzen?

Weil wenn public void onReceiveValue(String html) aufgerufen wird, ist der Wert ja vorhanden und richtig
 
swa00

swa00

Moderator
Teammitglied
Wie du bereits selbst festgestellt hast , ist deine obiger Callback zeitlich kritisch.
Ein WebView eignet sich i.d.R. nur zu einem "View" - wie der Name schon sagt ..

Kompliziert ? Ich bitte Dich - maximal 10 Zeilen :)
 
kukuk

kukuk

App-Anbieter (kostenlos)
Threadstarter
Nagut, deine Info in Gottes Gehörgang.

Ich schau heute Abend mal was ich da gezaubert bekomme.

Ich sitze jetzt nicht vor einem Rechner mit AS^^, aber würde das dann so ungefähr aussehen?

Code:
Document doc = Jsoup.connect("http://meineseite_die_ich_auslese").get();
String textbox_value = doc.commandurl().text;
Kann man damit auch einen Text setzen?

Code:
[LEFT]Document doc = Jsoup.connect("http://meineseite_die_ich_auslese").get();
doc.commandurl().setText("" + master_3000)
[/LEFT]


 
swa00

swa00

Moderator
Teammitglied
Steht alles in der API Referenz
Cookbook: jsoup Java HTML parser


BTW : Das was ich oben angeraten habe, ist eigentlich Standard-Prozedur, wenn man auf Webinhalte zugreift (Thread/Callback)
 
kukuk

kukuk

App-Anbieter (kostenlos)
Threadstarter
Ok. Ich werde mir das nachher anschauen und was basteln.
 
Oben Unten