Status-App - Frage

S

Schmittes

Neues Mitglied
2
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
 
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
 
  • Danke
Reaktionen: Schmittes
Genau das habe ich gemeint.
Vielen Dank für deine Hilfe, werd mich gleich mal dranmachen und weiter programmieren.
 
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
 
Kann mir keiner helfen ? :blink:

Schmittes :D
 
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
 
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.
 
  • Danke
Reaktionen: Schmittes
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
 
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:
 
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.
 
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 ;)
 
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 ;)
 
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.
 
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
 
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 ?
 
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:
Schmittes schrieb:
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"
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?
 
Hallo Jan,
danke für deine Antwort.
Im Logcat bekomm ich folgende Meldungen:

03-28 11:12:21.622: E/AndroidRuntime(319): FATAL EXCEPTION: main
03-28 11:12:21.622: E/AndroidRuntime(319): java.lang.IllegalStateException: Could not execute method of the activity
03-28 11:12:21.622: E/AndroidRuntime(319): at android.view.View$1.onClick(View.java:2144)
03-28 11:12:21.622: E/AndroidRuntime(319): at android.view.View.performClick(View.java:2485)
03-28 11:12:21.622: E/AndroidRuntime(319): at android.view.View$PerformClick.run(View.java:9080)
03-28 11:12:21.622: E/AndroidRuntime(319): at android.os.Handler.handleCallback(Handler.java:587)
03-28 11:12:21.622: E/AndroidRuntime(319): at android.os.Handler.dispatchMessage(Handler.java:92)
03-28 11:12:21.622: E/AndroidRuntime(319): at android.os.Looper.loop(Looper.java:123)
03-28 11:12:21.622: E/AndroidRuntime(319): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-28 11:12:21.622: E/AndroidRuntime(319): at java.lang.reflect.Method.invokeNative(Native Method)
03-28 11:12:21.622: E/AndroidRuntime(319): at java.lang.reflect.Method.invoke(Method.java:507)
03-28 11:12:21.622: E/AndroidRuntime(319): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-28 11:12:21.622: E/AndroidRuntime(319): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-28 11:12:21.622: E/AndroidRuntime(319): at dalvik.system.NativeStart.main(Native Method)
03-28 11:12:21.622: E/AndroidRuntime(319): Caused by: java.lang.reflect.InvocationTargetException
03-28 11:12:21.622: E/AndroidRuntime(319): at java.lang.reflect.Method.invokeNative(Native Method)
03-28 11:12:21.622: E/AndroidRuntime(319): at java.lang.reflect.Method.invoke(Method.java:507)
03-28 11:12:21.622: E/AndroidRuntime(319): at android.view.View$1.onClick(View.java:2139)
03-28 11:12:21.622: E/AndroidRuntime(319): ... 11 more
03-28 11:12:21.622: E/AndroidRuntime(319): Caused by: java.lang.ClassCastException: android.widget.Spinner
03-28 11:12:21.622: E/AndroidRuntime(319): at app.flugstatus.MSVHFlugstatusActivity.okButton(MSVHFlugstatusActivity.java:118)
03-28 11:12:21.622: E/AndroidRuntime(319): ... 14 more
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?
 
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.
Caused by: java.lang.ClassCastException: android.widget.Spinner
 
  • Danke
Reaktionen: Schmittes
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
 

Ähnliche Themen

Manny87
  • Manny87
Antworten
11
Aufrufe
161
swa00
swa00
R
  • Robby1950
2
Antworten
23
Aufrufe
1.007
Robby1950
R
netfreak
  • netfreak
Antworten
10
Aufrufe
455
netfreak
netfreak
Zurück
Oben Unten