1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Status-App - Frage

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Schmittes, 17.03.2012.

  1. Schmittes, 17.03.2012 #1
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    Hallo zusammen,
    ich bin neu hier und eigentlich völliger Noob in der Java-Programmierung. Ich weiß, jetzt werden viele von euch sagen "Lern erstmal ein wenig Java!". Ich habe aber dank vieler Tutorials und einigem einlesen in die Materie sowie 'Learning by Doing' meine erste App "geschrieben" bzw. bin dabei sie zu schreiben.
    Bei der App handelt es sich um eine Art Statusabfrage. Ich habe auf einem Webserver eine Textdatei, die immer zwischen zwei Texten hin- und herschaltet. Ich bin in meiner App jetzt soweit gekommen, dass beim drücken eines Buttons der aktuelle Status des Textes auf dem Webserver abgerufen wird.
    Nun zu meinem Problem: Bis jetzt habe ich es nur geschafft mir die aktuell vorliegende Textdatei in einem TextView anzeigen zu lassen, ich möchte jedoch je nach Textstatus einmal das die App ON und einmal das sie OFF schreibt.
    Ich hoffe ihr wisst was ich meine und könnt mir ein wenig unter die Arme greifen.

    MfG.: Schmittes :D
     
  2. ChrisMobile, 17.03.2012 #2
    ChrisMobile

    ChrisMobile Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    Wenn ich die Frage richtig verstanden habe, meinst du wohl einfach sowas oder?

    Code:
    String status = pseudoCode.getStringFrom(Website);
    ...
    If(status.equalsIgnoreCase(text1)) {
      status = "on";
    } else if (status.equalsIgnoreCase(text2)){
     status = "off";
    } else {
      // Error
    }
    ...
    
    VG Chris
     
    Schmittes bedankt sich.
  3. Schmittes, 17.03.2012 #3
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    Genau das habe ich gemeint.
    Vielen Dank für deine Hilfe, werd mich gleich mal dranmachen und weiter programmieren.
     
  4. Schmittes, 18.03.2012 #4
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    Ok, bin so langsam am Verzweifeln :razz:
    Ich schein wohl irgendwie zu doof zu sein, aber ich kriegs einfach nicht hin. Ich poste jetzt einfach mal meinen bisherigen Code. Vielleicht kann mir ja jemand auf die Sprünge helfen, wäre sehr nett.

    Code:
    package app.flugstatus;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    
    public class MSVHFlugstatusActivity extends Activity {
        
        TextView httpStuff;
        TextView ergebniss;
        
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            //TODO Auto generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);}
            
            public void ButtonKlick (View view) {
                httpStuff = (TextView) findViewById(R.id.tvHttp);
                GetMethod test = new GetMethod();
                String returned;
                try {
                    returned = test.getInternetData(); 
                    httpStuff.setText(returned);
                } catch (Exception e) {
                    
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            
        }
    }
    Grüßle Schmittes
     
  5. Schmittes, 18.03.2012 #5
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    Kann mir keiner helfen ? :blink:

    Schmittes :D
     
  6. Schmittes, 18.03.2012 #6
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    So, nach stundenlanger Quälerei, scheint es wohl so, als ob ich doch ein wenig weitergekommen bin. Meine App gibt mir ja die Textdatei, die online ist in einem TextView aus. Jetzt soll in einem zweiten TextView entweder "ON" oder "Off" erscheinen, je nachdem, was im ersten TextView drin steht.

    Nur irgendwie will das nich so richtig klappen. Ich bin doch richtig in der Annahme, dass das so geschrieben werden muss:

    Code:
    ...
    
    if (httpStuff.getText().toString() == "online") {
                    ergebniss.setText("ON");
                    
                }else{
                    ergebniss.setText("Off");
                }
    ...
    Bei mir will das aber nicht so wirklich klappen, er schreibt immer "Off", obwohl im Text "online" steht. :blink:
    Ach ja, mein erster TextView ist httpStuff, der schreibt mir quasi den Text den ich online stehen habe; auch wenn er das nicht soll, aber anderst hab ichs nicht hinbekommen ... .

    MfG.: Schmittes
     
  7. ChrisMobile, 18.03.2012 #7
    ChrisMobile

    ChrisMobile Android-Experte

    Beiträge:
    529
    Erhaltene Danke:
    74
    Registriert seit:
    17.03.2010
    Phone:
    HTC One X
    Ich hab dir doch oben schon ein Beispiel gegeben!

    Bei dem Vergleich von zwei Strings funktioniert "==" nicht, da im Gegensatz zu Integer, Double, Boolean etc. nicht bei Strings.
    Hier wird geprüft ob beide Strings die selbe Referenz haben (klingt komisch ist aber so).

    Die Inhalte von Strings werden mit str1.equalsIgnoreCase(str2) (beachtet nicht die Groß- und Kleinschreibung) oder str1.equals(str2) verglichen.

    In deinem Beispiel wäre das:
    Code:
    if (httpStuff.getText().toString().equalsIgnoreCase("online")) {
                    ergebniss.setText("ON");
                    
                }else{
                    ergebniss.setText("Off");
                }
    
    Sinnvoller wäre aber (ebenfalls in meinen Beispiel gewesen):
    Code:
    if (httpStuff.getText().toString().equalsIgnoreCase("online")) {
                    ergebniss.setText("ON");
                    
                }else if (httpStuff.getText().toString().equalsIgnoreCase("offline")) {
                    ergebniss.setText("Off");
                } else {
                    //ergebniss.setText("Error");
                    ergebniss.setText(httpStuff.getText().toString());
                }
    
    Das liegt daran, dass ein anderer Text (else) als "online", ja nicht zwingend "offline" sein muss. Es könnte ja u.U. auch etwas schief gelaufen sein o.Ä..
    Um httpStuff nicht in ein TextView zu schreiben, könntest du doch einfach einen ganz normalen String benutzen.

    PS: Auch wenn du es nicht gerne hören wirst, das sind GRUNDLAGEN! Du solltest dir wirklich noch einmal Java-Grundlagen aneigenen.
     
    Schmittes bedankt sich.
  8. Schmittes, 19.03.2012 #8
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    So, hab deinen Rat mit den Grundlagen mal befolgt und hab mir bissl den Developers-Guide durchgelesen. Und siehe da, ich konnte alle meine Probleme lösen und die App letztendlich fertigschreiben, sodass sie funktioniert. Und das alles ohne weiteres nachfragen.

    Vielen Dank für deine tolle Hilfe :thumbup:

    Schmittes
     
  9. Schmittes, 23.03.2012 #9
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    So ich nerf nochmal :D

    Meine App funktioniert soweit ganz gut. Ich möchte aber die Möglichkeit haben sie im Hintergrund weiterlaufen zu lassen, so dass sie alle x-Minuten (aus einem Spinner gewählte Zeit) den Status abruft und bei Änderung einen Warnton abgibt.
    Bin da jetzt auf den IBinder-Service gestoßen mit Receiver. Würde das funktionieren oder ratet ihr mir davon ab?

    Wie lässt sich das sonst realisieren?


    Freue mich über jegliche Art von Hilfe oder Tipps ;)

    Schmittes :smile:
     
  10. JanF, 23.03.2012 #10
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
    Einen IBinder wirst Du wohl nicht brauchen, ein Service ist eine Möglichkeit der Realisierung.

    Ich würde über den AlarmManager regelmäßig einen Service starten und den Service die Arbeit erledigen lassen (ginge auch in einer Activity anstatt Service, aber das würde den Nutzer wohl ziemlich nerven).

    Dann kann der NotificaitionManager die weitere Verarbeitung erledigen.
     
  11. Schmittes, 23.03.2012 #11
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    Cool, danke für deine schnelle Antwort. Werde mir das mal anschauen, hört sich gut an.

    Ich melde mich sobald ich einen Erfolg, oder auch Misserfolg, verzeichnen kann. :D

    Lg
    Schmittes ;)
     
  12. Schmittes, 23.03.2012 #12
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    So, ich hab jetzt bissl rumprobiert. Aber irgendwie steig ich da nicht so ganz durch. Ich hab mir jetzt nen Service gemacht der vom AlarmManager gestartet werden soll. Für den AlarmManager hab ich wiederum einen Service erstellt und mich dabei sehr an diesem hier orientiert und ihn quasi auf meine App zurechtgecodet:

    AlarmService.java | Android Developers

    Ich versteh aber immer noch nicht ganz wie ich den AlarmManager dann auf Knopfdruck starten und beenden kann. (Ich glaube das geht in dem Service automatisch, da der ja nach ButtonClicks schaut oder?!) :blink:
    Und wie ich den Timer für den Alarm aus meinem Spinner herauslesen kann. (Also die "Abfrage-Zeit" aus meinem Spinner)

    Würde mich über nen Tipp freuen der mir bissl auf die Sprünge hilft. Vielleicht bin ich ja nah dran und sehs nur nicht. Ich kann auf Wunsch auch mal den ganzen Code einstellen aber das wollte ich euch jetzt nicht antun weil ich denke, das es so auch verständlich ist was ich meine (zumindest hoffe ich das).

    Schmittes ;)
     
  13. JanF, 26.03.2012 #13
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
    Ein Service reicht, und Du brauchst broadcast Receiver. Wenn der Service nicht durchgehend laufen soll (was er nicht braucht) muss der Receiver separat sein. Dieser kann den Service starten und aus
    Code:
    onStart()  oder OnStartCommand()
    raus kann der Service seine Aufgaben erledigen - auch wenn er über einen Button gestartet wird.
     
  14. Schmittes, 26.03.2012 #14
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    Ok, ich habs geschafft....
    Ich bin endgültig verwirrt :crying:

    Meine bisherige App ruft über eine GetMehod online einen Text ab, und gibt mir je nach "Art des Textes" dann entweder:

    "ON" oder "OFF" in einem TextView aus.

    Bis dahin schön und gut!

    Bei dem Versuch jetzt per Button die App in einem, aus einem Spinner gewählten Zeitzyklus, das selbe im Hintergrund machen zu lassen um mir dann bei Änderung des Status einen Signalton auszugeben scheitere ich jedoch kläglich.
    Ich bin nun total verwirrt, wie das mit AlarmManager, BroadcastReceiver und Spinner gehen soll. :confused:

    Vielleicht sollte ich es einfach lassen! :blushing:
    Aber danke für eure Hilfe.

    Lg Schmittes
     
  15. Schmittes, 27.03.2012 #15
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    Ok, hab mir das ganze jetzt nochmal Schrittweise vorgenommen, und wenn ich das jetzt richtig verstanden habe funktioniert das wie folgt:

    In meiner, ich nenn sie jetzt mal "Main-Activity" habe ich unter einem Button den AlarmManager, dieser Startet meinen BroadcastReceiver und der wiederum startet meine Activity, die dann wiederum nachschaut ob sich was geändert hat und bei Bedarf dann einen Signalton sowie Meldung ausgibt ?! Ist das so richtig oder bin ich echt total daneben ?
     
  16. Schmittes, 27.03.2012 #16
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    So, ich glaub den BroadcastReceiver und ein Teil der Activity, die gestartet werden soll sind fertig; aber in meinem Hauptcode hab ich noch Probleme. Jedesmal wenn ich den AlarmManager starte bekomm ich die Fehlermeldung "The Application... has stoped unexpectedly. Force Close"

    Ich nehme mal an, dass mein Problem in diesem Code-Schnipsel liegt:

    Code:
    ...
    
    
        // OK_Button defined here
    
        public void okButton (View view) {
            int spinner1;
            EditText Times = (EditText)findViewById(R.id.spinner1);
            spinner1 = Integer.parseInt(Times.getText().toString());
            android.app.AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
            builder2.setMessage("Die App schaltet nun in den Überwachungsmodus");
            builder2.setCancelable(true);
            // get a Calendar object with current time
             Calendar cal = Calendar.getInstance();
             // add minutes to the calendar object
             cal.add(Calendar.MINUTE, spinner1);
            Intent intent = new Intent(this, AlarmReceiver.class);
             // In reality, you would want to have a static variable for the request code instead of 192837
             PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
             
             // Get the AlarmManager service
             AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
             am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
            
            builder2.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    
                    // Here we have to work! Add the AlarmManager here!
                    initNotification();
                        }
                        });
                    
    
    ...
    Und eigentlich wollte ich den AlarmManager unter builder2.setPositiveButton starten, so wie auch schon die Notification ?!
    Würde mich über erneute Hilfe freuen :D
     
    Zuletzt bearbeitet: 27.03.2012
  17. JanF, 28.03.2012 #17
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
    Was steht denn für ein stacktrace im logcat? Meistens ist das selbst erklärend, bzw. wenn man das Lesen von diesem nicht so gewohnt ist, kommt man mit google weiter.

    Als ich das jetzt nochmal gelesen habe, ist mir aufgefallen, dass der Broadcast Receiver nicht nötig wäre (aber auch nicht schadet) und ich diesen in einem Projekt von mir auch (derzeit) unnötigerweise nutze. Wenn später auch andere Module bescheid geben können sollen, sieht es natürlich anders aus.

    Was willst Du jetzt noch konkret erreichen ohne zu wissen, wie?
     
  18. Schmittes, 28.03.2012 #18
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    Hallo Jan,
    danke für deine Antwort.
    Im Logcat bekomm ich folgende Meldungen:

    Leider habe ich selbst keine Ahnung wie ich das genau auswerte, aber von dem was ich hoffe zu verstehen, nehme ich mal an, dass mein Fehler im Code-Schnipsel steckt den ich zuvor gepostet hatte.

    Im Grunde möchte ich nur, das ich die Zeit für den AlarmManager aus meinem Spinner wählen kann und dass dieser dann, so wie auch schon die initNotification unterm "OK-Button" der Meldung gestartet wird und mich die App dann auf den Homescreen "wirft".

    An der Activity die gestartet werden soll, wollte ich mich jetzt erst nochmal selbst versuchen. -> Learning by Doing :rolleyes2:
    Aber diese soll mir ja dann nachschauen ob sich der Onlinetext geändert hat und mir dann ne Meldung sowie einen Signalton ausgeben wenn dem so wäre. --> Da überleg ich noch wie ich das mit dem Vergleich mache!

    Schmittes

    P.S.: Wenn ich das jetzt so sehe, scheint es wohl an meinem Spinner zu liegen oder bin ich da falsch?
     
  19. JanF, 28.03.2012 #19
    JanF

    JanF Android-Experte

    Beiträge:
    594
    Erhaltene Danke:
    79
    Registriert seit:
    31.03.2011
    Jupp scheint am Spinner zu liegen.
    Wenn R.id.spinner1 keine Unterklasse von EditText ist, kann dies nicht funktionieren und ich nehme an, es ist ein Spinner.
    Code:
    EditText Times = (EditText)findViewById(R.id.spinner1);
    Eine ClassCastException ist recht aussagekräftig.
     
    Schmittes bedankt sich.
  20. Schmittes, 28.03.2012 #20
    Schmittes

    Schmittes Threadstarter Junior Mitglied

    Beiträge:
    25
    Erhaltene Danke:
    2
    Registriert seit:
    17.03.2012
    Jo, es liegt am Spinner. Wenn ich ihn auskommentiere und als Zeit im cal.add(Calendar.Minute,1) schreibe geht´s für kurze Zeit xD

    Bekomm dann die nächste Fehlermeldung nach 1 Minute aber erstmal das mim Spinner jetzt sonst gibt das ein wahrloses durcheinander!

    Anstelle der "1" soll da dann mein "Spinner" hin, indem Zahlen stehen!

    Hab mal selbst bissl dran rumprobiert und bis jetzt sieht es dann so aus:

    Code:
    spinData = (Spinner) findViewById(R.id.spinner1);
             int spinTime = spinData.getSelectedItemPosition();
    Wenn ich jetzt spinTime anstelle der "1" schreibe geht das aber leider nicht, da muss ich nochmal lesen und nachdenken!
    Da bin ich jetzt dran aber das will noch nicht so wie ich es gerne hätte :D

    Lg
     

Diese Seite empfehlen