Probleme mit Boolean

  • Ich habe probleme mit boolean werten. Und zwar überprüfe ich in meinem android projekt über ein thread den onlinestatus zweier url's. der thread wird über die MainActvity.onCreate()-methode ausgeführt. im thread wird ein boolean attribut auf false gesetzt, wenn der url's nicht erreichbar sind, sonst true. diesen wert gebe ich dann an eine klasse weiter, die die boolean-werte speichert (get-set methoden). ich habe es mit log-einträgen überprüft, welches mir stets die richtigen werte nach der übergabe angezeigt hat. wenn die server aber nicht online sind, dann soll es eine nachricht ausgeben. dazu habe ich in der MainActvity.onCreate()-methode (nach den try-catch-blöcken) eine if-bedingung eingeführt, die folgendermaßen aussieht:


    Code
    if(!ServerOnlineCheck.isServerAisOnline() && !ServerOnlineCheck.isServerBisOnline()) {
    			showServerUnreachableMessage();
    		}


    und obwohl die server online sind und auch über den log-eintrag die gespeicherten boolean-werte true sind, wird die showServerUnreachableMessage(); ausgeführt. habe dann davor auch log-einträge gemacht um zu sehen was für boolean-werte gespeichert sind bzw. von der if-bedingung aufgerufen werden und es sind false werte. wieso sind die false? Die true false-werte werden nur über den thread übergeben. über logeinträge sehe ich dass diese ture sind und später dann false. (kopfkratz) :-/


    kann mir das einer erklären?? Ich raffe das nicht :/


    danke im voraus

  • Spontan würde ich prüfen, ob das Objekt im Thread, dem du die Bool-Werte zuweist, dasselbe Objekt ist wie in der MainActivity bei der Abfrage.
    Ich vermute mal das nicht. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo CdWechsler,


    Code
    if(!ServerOnlineCheck.isServerAisOnline() && !ServerOnlineCheck.isServerBisOnline()) {
    			showServerUnreachableMessage();
    		}


    eine Frage hätte ich dazu:
    Was passiert, wenn du

    Code
    if((!ServerOnlineCheck.isServerAisOnline()) && (!ServerOnlineCheck.isServerBisOnline())) {
    			showServerUnreachableMessage();
    		}


    schreibst?


    Schöne Grüße, schymura ^^

  • Ich meine in einem anderen Thread von dir gesehen zu haben, dass das bei dir wie folgt abläuft (Pseudocode)

    Code
    Thread erstellen;
     Thread starten;
    
    
     Abfrage (URL1.online() && URL2.online()) { tu was;}


    Falls es wirklich noch so aufgebaut ist (und das ist auch das, was ich aus deiner Beschreibung des Problems vermute), vergisst du das Konzept, welches hinter Threads steht. Ein Thread zu erstellen und abzuarbeiten kostet nunmal Zeit. D.h. während der Thread erstellt und abgearbeitet wird, läuft der UI-Thread immer noch fröhlich weiter (die onCreate()-Methode). Daher ist bei der Abfrage das boolean immer noch false, weil der Thread eben nicht schnell genug war diesen zu aktualisieren.


    block_

  • @lucas de vil


    ne ne, ich nutze keine weiteren bool-werte. zuweisung ist schon richtig. aber bekomme nicht du gespeicherten werte, hmm... !?


    schymura


    ne das bringt nichts. habe doch vorher geschrieben, dass ich mit log-einträgen gecheckt habe, was für werte aufgerufen werden. es sind false werte :(


    Also ich weiß nicht ob ich zu kompliziert denke, aber was ich will ist nur bool-werte die über einen thread festgelegt werden in einer anderen klasse speichern. Auf diese klasse bzw. werte, möchte ich dann aus der Mainactvity zugreifen können.


    Ich bin bis jetzt folgendermaßen vorgegangen:


    Die onCreate()-Methode der MainActvity (rest ist egal):



    Thread


    die klasse wo die bool-werte gespeichert werden:



    Könnte jmd. eine simples beispiel eventuell posten, wo man über der oncreate()-methode der mainActivity einen thread ausführt, der eine url nach dem status ceckt und das ergebnis als bool-wert in einer separaten klasse speichert und letztendlich an eine textview übergibt? man könnte dafür die meisten codes von oben verwenden. ich danke im voraus für die hilfen und ratschläge



    block_
    habe dein post gerade gelesen. Ähm.. ja genau so sieht es aus :)
    Aber wie können die werte false sein? diese werte gebe ich doch über den thread? bei der deklaration habe ich zumindestens keine werte zugewiesen (siehe code). wie sollte/könnte man das dann lösen?

  • block_
    habe dein post gerade gelesen. Ähm.. ja genau so sieht es aus :)
    Aber wie können die werte false sein? diese werte gebe ich doch über den thread? bei der deklaration habe ich zumindestens keine werte zugewiesen (siehe code). wie sollte/könnte man das dann lösen?


    Der Programmablauf ist doch der:
    onCreate wird ausgeführt
    Thread wird erstellt
    Thread wird gestartet
    onCreate wird weiter verarbeitet.


    Was im Thread passiert muss da noch gar nicht existieren.
    Entweder du machst statt eines Threads eine Runnable und vergleichst dann die Zustände am Ende der Runnable.
    Oder du machst es richtig und stellst für die Threads noch Callback-Funktionen ein, die aufgerufen werden, wenn die Status ordentlich geprüft wurden.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Aber wie können die werte false sein? diese werte gebe ich doch über den thread? bei der deklaration habe ich zumindestens keine werte zugewiesen (siehe code).


    Du hast es nicht explizit zugewiesen, aber primitive Datentypen haben immer einen Standartwert. Bei boolean ist es false, bei int ist es 0, etc.. (Nicht-primitive Datentypen, bspw. String, haben als Standartwert immer null.)


    block_

  • @Lucas:
    Stimmt, du hast recht. Habe ich völlig vergessen. Die Threads werden ja parallel im Hintergrund ausgeführt, während der UI-Thread weiter macht. Wenn ich den blockieren würde, bis die Threads abgearbeitet und geschlossen wurden, wäre das keine gute Lösung. ok... dann mache ich das mal anders. Eine andere Frage: ich dachte mit dem handler ein callback-mechanismus implementiert zu haben!? (siehe code: handler.post(new Runnable() { ... }); ). Könntest du mir einen Beispiel geben wie du das gemeint hast? (allgemein gefragt)


    @block
    ah ok. Gut zu wissen. danke :)

  • Stimmt, du hast recht. Habe ich völlig vergessen. Die Threads werden ja parallel im Hintergrund ausgeführt, während der UI-Thread weiter macht. Wenn ich den blockieren würde, bis die Threads abgearbeitet und geschlossen wurden, wäre das keine gute Lösung. ok... dann mache ich das mal anders.


    Das ist etwas, dass ich an Androids Zwang zum Nebenthread für Netzwerkkommunikation hasse. ;)
    Am Einfachsten wäre es wohl, wenn du nur eine 'Konnektivität wird geprüft'-Activity vorschaltest und nach erfolgreichem Prüfen der Server die wahre MainActivity startest.



    Eine andere Frage: ich dachte mit dem handler ein callback-mechanismus implementiert zu haben!? (siehe code: handler.post(new Runnable() { ... }); ). Könntest du mir einen Beispiel geben wie du das gemeint hast? (allgemein gefragt)


    Nun, dein Callback-Mechanismus ist kein Callback-Mechanismus.
    Du führst deine Aktion lediglich auf dem Mainthread aus. Das bedeutet aber eben nicht, dass deine Activity ihre Objekte manipuliert – sie ändert nur die Objekte aus deinem Thread.


    Ein 'richtiges' Callback besteht im Groben aus zwei Komponenten.
    1) Einem Java Interface
    2) der Zuweisung eines Objekts dieses Interfaces


    Beispiel:

    Java
    public interface StatusChecker
    {
      public void serverIsOnline(ServerOnlineCheck theServer);
      public void serverIsOffline(ServerOnlineCheck theServer);
    }


    Deine Activity muss nun dieses Interface implementieren und damit auch die Methoden bereitstellen.
    (Finde ich ein bisschen dämlich, weil es keine optionalen Methoden gibt, man also ALLES aus dem Interface implementieren muss. Java ist nun einmal so starr.)


    Deinen Thread gibst du jetzt noch ein Objekt mit, dass eben dieses Interface implementieren muss.

    Java
    public class ConnectionControlThread implements Runnable 
    {
      private StatusChecker callbackObject;
    //...


    In deiner Activity setzt du entsprechend diese Instanzvariable:

    Java
    //...
    			Thread thread1 = new Thread(ccThread);
    			thread1.setCallbackObject(this);
    			thread1.start();
    //...


    Und in deinem Thread hast du nicht mehr allzu viel zu tun:


    Es wäre übrigens noch um Längen geiler, wenn du statt eines blöden Threads lieber einen ASyncTask nützest.


    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!