CountDown in Service

  • Antworten:11
  • Bentwortet
Julian Mangelberger
  • Forum-Beiträge: 8

24.11.2012, 10:59:03 via Website

Ich möchte eine App schreiben in der unter anderem ein Countdown läuft. Dieser soll auch weiter laufen wenn die App geschlossen wurde. Dazu möchte ich ihn in einem Service starten. Immer wenn ich den Service jetzt jedoch starten möchte bekomme ich einen Fehler. Da die App ein Teil meines Maturaprojektes ist, wäre ich sehr dankbar über jede Hilfe.

mfg Julian

Hier mein Code:

Starten des Services wenn ein Button gedrückt wird.
1save.setOnClickListener(new View.OnClickListener() {
2
3 public void onClick(View arg0) { //countdown starts by preesing a button
4 // TODO Auto-generated method stub
5 ssf = Integer.parseInt(essf.getText().toString());
6 Intent openCountDownService = new Intent("julian.mangelberger.ultravioletobservation.COUNTDOWNSERVICE");
7 startService(openCountDownService);
8 }
9 });

Service Class:
1public class CountDownService extends IntentService {
2
3 public CountDownService(String name) {
4 super(name);
5 // TODO Auto-generated constructor stub
6 }
7
8 @Override
9 protected void onHandleIntent(Intent intent) {
10 while (TabMainActivity.progressBarStatus <= 100) {
11 try {
12 Thread.sleep(500);
13 } catch (InterruptedException e) {
14 e.printStackTrace();
15 }
16 TabMainActivity.progressBarStatus++;
17 TabMainActivity.progressbar1.setProgress(TabMainActivity.progressBarStatus);
18
19 }
20 }
21
22
23 }

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

24.11.2012, 11:18:31 via Website

Den Fehler den du bekommst sollen wir erraten ?

Du solltes niemals aus einem Service auf die UI zugreifen, evtl ist das schon dein Problem!

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

24.11.2012, 11:38:38 via Website

Das Konzept ist ein wenig schräg.

Wozu soll der Service, der nur eine Progressbar aktualisiert, weiterlaufen, wenn die App nicht mehr läuft.
Ein Service ist für eine Progressbaraktualisierung auf alle Fälle ein over-kill.
Ein GUI-Zugriff geht außerdem so direkt nicht.
...... oder was hast Du vor ?

Antworten
Julian Mangelberger
  • Forum-Beiträge: 8

24.11.2012, 11:58:27 via Website

Der Fehler ist: Die Anwendung ... wurde unerwarted beendet. Versuchen sie es erneut.

Ja der ProgessbarStatus soll weiter aktualisiert werden die App beendet wird. Wenn die App dann wieder gestarted wird, soll die Progressbar aktualisiert werden und auf den ProgessbarStatus gesetzt werden.
Was meinst du mit schrägem konzept? Sorry ich habe erst vor kurzem angefangen Android zu programmieren und meine Java kenntnisse sind auch überschaubar.

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

24.11.2012, 12:27:30 via Website

Weiß ja nicht genau was Du vor hast.

"Ja der ProgessbarStatus soll weiter aktualisiert werden die App beendet wird."
Was soll das denn heißen? Wenn die App nicht läuft gibt es keinen Progressbar und keine TabMainActivity !

Willst Du:

1. Jedesmal wenn der Service feuert deine App startet und deine TabMainActivity hoch poppt.

2. Nur den Status speichern und nur dann wenn die TabMainActivity sichtbar ist dort den Progressbar aktualisieren.

Antworten
Julian Mangelberger
  • Forum-Beiträge: 8

24.11.2012, 12:43:15 via Website

Nur den Status speichern und nur dann wenn die TabMainActivity sichtbar ist dort den Progressbar aktualisieren.

Ich hab jetzt herausgefunden, dass sich die Anwendung nicht wegen dem starten des Services aufgehängt hat. Ich habe da noch eine Vriable auf den Inhalt eines EditTextes gesetzt. Das hat den Fehler ausgelöst. Jetzt hängt sich die App zwar nicht mehr auf, aber funktionieren tus auch noch nicht.^^ Wenn ich den Button drücke geschiet einfach nichts.

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

24.11.2012, 13:08:32 via Website

Julian Mangelberger
Nur den Status speichern und nur dann wenn die TabMainActivity sichtbar ist dort den Progressbar aktualisieren.
Ziel ist jetzt klar.
Julian Mangelberger

Jetzt hängt sich die App zwar nicht mehr auf, aber funktionieren tus auch noch nicht.^^ Wenn ich den Button drücke geschiet einfach nichts.
Woher soll ich wissen was Du beim drücken deines Buttons machst?

Aufgabe noch mal klar definieren.
Wenn die TabActivity existiert, soll der Progressbar aktualisiert werden. Wenn nicht, soll der nur Status gespeichert werden.
(Wie oft muß überhaupt aktualisiert werden?)

Den aktuellen Status muß Du fest außerhalb der App sichern. Datei oder so.
(Eine Möglichkeit ist auf diese Datei in der Activity zu pollen - nicht schön - besser direkte Aktualisierung)

Die Frage ist bloß wie erkennt man ob die TabActivity existiert - ob also nur gespeichert oder aktualsiert werden muß.

Würde bein Start der Activity ein Flag setzen und bein Pause wieder zurück setzen.
Da Du sowieso keinen direkten GUI-Zugriff vom Service aus hast würde ich beides mit einem Hander erschlagen.

Handler h = new Handler()
{
@Override public void handleMessage(Message msg)
{ aktualsierProgrssbar() }
}
Den erzeugst Du in der Activity. Beim Beenden auf null setzen.

Im Service testetst Du ob h==null, falls nein Bar aktualisiern (h.SendEmptyMessage(0);, falls ja nur speichern.

Sind nur so spontane Ideen..............

— geändert am 24.11.2012, 13:13:49

Antworten
Julian Mangelberger
  • Forum-Beiträge: 8

24.11.2012, 13:18:48 via Website

Wenn ich jetzt den Status im Service immer herunter zähle, bleibt dieser doch immer aktuell. Und wenn ich nun in der Activity den Status abfrage und die ProgressBar entprechend setzte muss ich doch den Wert nicht in einer Datei speichern oder? Und warum brauche ich das Flag? Die ProgressBar kann doch nur aktualisiert werden, wenn die Activity läuft.

Antworten
Julian Mangelberger
  • Forum-Beiträge: 8

24.11.2012, 13:43:39 via Website

Wenn ich mit dem debugger zur Zeile: "startService(openCountDownService);" gehe und dann auf step into, öffnet sich ein ContextWrapper.class. Dort steht drinnen:

Class File Editor


Source not found
the JAR file has no source attachment.


Kann es sein, dass ich schon einen Fehler beim starten des Services habe? Wenn ja wie mache ich es genau?
Jetzt habe ich im Manifest folgendes stehen:
<service
android:name="julian.mangelberger.ultravioletobservation.COUNTDOWNSERVICE">
</service>

Und im OnClickListener folgendes:
Intent openCountDownService = new Intent("julian.mangelberger.ultravioletobservation.COUNTDOWNSERVICE"");
startService(openCountDownService);

Antworten
Andreas Weichert
  • Forum-Beiträge: 287

24.11.2012, 14:14:32 via Website

So richtig klar ist mir es auch nicht wie in Android dieses ganze Speicherverwaltung und das Objektmanagement funktioniert - muß ich zugeben.

Also erstmal sollte der Service richtig starten. Den Progressbar würde ich erstmal rausnehmen.

Was mir auffällt: Unterschiedlich Grossklein-Schreibung

Intent openCountDownService = new Intent("julian.mangelberger.ultravioletobservation.COUNTDOWNSERVICE"");
class CountDownService;

— geändert am 24.11.2012, 14:15:08

Antworten
Julian Mangelberger
  • Forum-Beiträge: 8

24.11.2012, 14:45:58 via Website

Ja danke erst mal für die Hilfe. Ich versuch mal weiter den Service zum laufen zu bringen. Ich meld mich wenns w.as neues gibt

Antworten
Julian Mangelberger
  • Forum-Beiträge: 8

28.11.2012, 14:59:23 via Website

So funktioniert jetzt ;).
Der Fehler lag beim starten des Services.

Habe folgendes geädert:

final Intent openCountDownService = new Intent(this, CountDownService.class);
startService(openCountDownService);

Antworten