Android Studio v2.3.3 etwas in einer Service Classe starten

  • Antworten:4
Tobias Tress
  • Forum-Beiträge: 9

05.11.2017, 01:34:49 via Website

Hi ich habe folgendes Problem: Ich wollte folgenden Code schnipsel in einem Java Service starten doch da wird mir dann "runOnUiThread(new Runnable() {" rot angestrichen. Ich denke das da das "extends AppCompatActivity" fehlt aber da ich es nicht auch noch hinfügen kann dachte ich mir das ich es in einer anderen Java Class mache wo "static" ist. Doch dann wird mir das gleiche rot unterstrichen da ich diese Methode nicht "static" machen kann. Also wäre meine Frage ob mir jemand helfen kann diesen Code von einem Service aus starten?

Hier der Code [Java ]
"
public void sendToServer1(final String text){

    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                String textparam = "text1=" + URLEncoder.encode(text, "UTF-8");

               URL scripturl1 = new URL(scripturlstring1);
                HttpURLConnection connection = (HttpURLConnection) scripturl1.openConnection();
                connection.setDoOutput(true);
                connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                connection.setFixedLengthStreamingMode(textparam.getBytes().length);

                OutputStreamWriter contentWriter = new OutputStreamWriter(connection.getOutputStream());
                contentWriter.write(textparam);
                contentWriter.flush();
                contentWriter.close();

                InputStream answerInputStream1 = connection.getInputStream();
                final String answer = getTextFromInputStream1(answerInputStream1);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        Hintergrudservice.Antwort = answer;
                    }
                });

                answerInputStream1.close();
                connection.disconnect();

                Timer = 1;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();

}

public static String getTextFromInputStream1(InputStream is1){
    BufferedReader reader1 = new BufferedReader(new InputStreamReader(is1));
    StringBuilder stringBuilder1 = new StringBuilder();

    String aktuelleZeile;
    try {
        while ((aktuelleZeile = reader1.readLine()) != null){
            stringBuilder1.append(aktuelleZeile);
            stringBuilder1.append("\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return stringBuilder1.toString().trim();
}

"
Danke im voraus.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.11.2017, 02:14:28 via App

Wenn du in einem Service Umfeld bist, gibt es keine. UI Thread, da der Service ja unabhängig der UI sein kann.

Warum braust du den UI Thread denn Unbedingt?
Bzw. wenn du den Brauchst, dann ist ein Service evtl. die falsche Wahl.

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

Ludyswa00

Antworten
Tobias Tress
  • Forum-Beiträge: 9

05.11.2017, 13:19:47 via Website

Hi danke für die schnelle Antwort.
Ich brauch den Service da er vom Alarmmanager alle 10 Minuten ausgeführt wird (Hintergrundprozess) und der Hintergrundprozess sollte diese PHP abfrage starten. Deswegen weiß ich nicht was ich anders machen kan.

Antworten
swa00
  • Forum-Beiträge: 3.704

05.11.2017, 13:34:52 via Website

Hallo Tobias,

du sprichst aber oben von einer UI , jetzt allerdings lediglich von einer Abfrage einer PHP in einem Service.
Und das was du oben zeigst ist kein Service , sondern ein Thread

Und da liegt dein Denkfehler : Für deine Abfrage in einem Service benötigst du keine UI, du kannst
- wenn du magst - an deine UI Activity ein Intent schicken und diese "hochholen".

Auch wichtig für Dich : ein Service läuft nicht 24/7 sondern kann jederzeit vom System beendet werden.
Sowas ist unter Android nur mir einigen Workarounds mehr oder weniger stabil zu realisieren (HeartBeat)

Vielleicht solltest umdenken und eher einen FCM integrieren - also der Server schickt dem Device etwas , wenn
er was Neues hat . (Push)

— geändert am 05.11.2017, 13:41:27

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

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.11.2017, 13:44:15 via App

Genau, gekoppelt mit Zyklischen Cronjobs dürfte das die beste und sauberste Lösung sein.

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

Antworten