CountDownTimer onFinish wird nicht immer ausgeführt

  • Antworten:3
Paule
  • Forum-Beiträge: 106

28.12.2013, 09:04:25 via Website

Guten Morgen,

ich habe folgendes Problem.

Ich benötige in meiner App einen Login. Ich habe dazu SharedPreferences verwendet um die Daten zu speichern nach dem der Login erfolgreich war. Jedoch muss der User nach 30 min automatisch wieder abgemeldet werden.

Dazu habe ich mir eine Klasse SessionTimer erstellt. (howLongTimerTick = 30)

1public class SessionTimer {
2
3 private CountDownTimer sessionTimer = null;
4
5 public void startTimer(int howLongTimerTick, final Activity parentActivity)
6 {
7 howLongTimerTick = howLongTimerTick * 60000;
8
9 this.sessionTimer = new CountDownTimer(howLongTimerTick, 10000)
10 {
11 @Override
12 public void onTick(long l) {}
13
14 @Override
15 public void onFinish() {
16 SharedPreferences sharedPreferences = parentActivity.getSharedPreferences(PREFS_NAME, 0);
17 SharedPreferences.Editor editor = sharedPreferences.edit();
18 editor.putBoolean("isLogin", false);
19 editor.putString("loginAt", "");
20 editor.putString("loginEMail", "");
21 editor.putString("loginPass", "");
22 editor.commit();
23 }
24 };
25
26 sessionTimer.start();
27 }
28}

Ein Objekt der Klasse erstelle ich in einer Klasse die von android.app.Application erbt, damit diese überall verfügbar ist.
Die startTimer Methode dieses Objektes rufe ich jedoch erst in einem Acticity die für den Login zuständig ist auf, wenn der user erfolgreich eingelogt ist.

Das Problem ist jetzt, dass die onFinish() Methode mal aufgerufen wird und mal nicht, nach dem Ablauf von 30 min. Egal ob ich mich noch in der App befinde oder nicht. Ich kann das Problem nicht dauerhaft nachstellen. Das Gleiche besteht auch wenn ich die normalen Timer-Klasse nehme. Hat das evt. was mit dem garbage collector zu tun? Kann ich Timer für das Vorhaben nicht verwenden?

Ich scheine etwas nicht zu beachten. In normalen Desktop Anwendungen laufen bei mir die Timer immer.

Ich hoffe ich konnte das Problem gut genug beschreiben. Da es nicht konstant auftritt ist es etwas schwierig :-)

Danke und Grüße

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

28.12.2013, 12:35:20 via Website

Je nach Speicher schmeisst das System deine Klassen aus dem Speicher, oder verlagert sie zumindest. Wie gesagt für 30 Minuten scheint ein AlarmManager besser geeignet zu sein. Einfach einen Alarm einstellen, dann per BroadcastReceiver drauf warten das der Alarm kommt und dann die Aktion starten die du möchtest.

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

Antworten
Paule
  • Forum-Beiträge: 106

28.12.2013, 20:27:24 via Website

Hallo,

mit dem AlarmManager scheint es besser zu klappen!

Danke!

Antworten