Threads laufzeit android

  • Antworten:17
  • OffenNicht stickyBentwortet
Gelöschter Account
  • Forum-Beiträge: 47

12.01.2017 00:27:44 via Website

Hallo, ich habe einen task oder sagen wir codeabschnitt, welcher jede minute ausgeführt werden muss. Er wurde auf die minute synchronisiert, das er genau auf die Minute startet. Nun die berechnungen in dem codeabschnitt nehmen Zeit in anspruch und da ich eine einfache Runnable dazu benutze muss ich vom post delay die Zeit abziehen(60000 - laufzeit) welche es dafür gebraucht hat, da es sonst eine verschiebung hätte. Nun zu meiner frage: Wenn ich den codeabschnitt in einem anderen thread ausführen würde, würde dann die laufzeit von dem "übernommen" werden? Oder wird die runnable warten bis der thread zu ende ist und dann erst postdelay aufrufen? Das würde mir nämlich viel arbeit ersparen. Ich hoffe das die Frage verständlich genug ist.

Liebe Grüße subrim

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.810

12.01.2017 08:34:38 via App

Hallo subrim!
Ein bisschen Code wäre hilfreich.
Ich weiß nicht ganz genau wie du das meinst.

LG Pascal //It's not a bug, it's a feature. :) ;)

subrimswa00

Antworten
  • Forum-Beiträge: 2.599

12.01.2017 08:38:47 via Website

Wenn ich den codeabschnitt in einem anderen thread ausführen würde, würde dann die laufzeit von dem "übernommen" werden?

Kommt darauf an , welche Art von Threads/Task du gebastelt hast, ob du eine Parallelisierung realisiert hast,
welche Parameter du übergibst , wie sie deklariert sind - und und und

So kann man die Frage nicht beantworten

Das würde mir nämlich viel arbeit ersparen

Wo bitteschön , kann man bei einer vernünfigen Programmierung Zeit sparen ?? :-)

— geändert am 12.01.2017 08:41:29

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 9.810

12.01.2017 10:29:21 via App

@Stefan ich nehme an er meint ob er die Zeitsteuerung neu "erfinden" muss oder die vorhandene nutzen kann.

LG Pascal //It's not a bug, it's a feature. :) ;)

subrim

Antworten
  • Forum-Beiträge: 2.599

12.01.2017 10:35:24 via Website

@Stefan ich nehme an er meint ob er die Zeitsteuerung neu "erfinden" muss oder die vorhandene nutzen kann.

Bin mal gespannt :-)

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

12.01.2017 11:53:17 via Website

Also nochmal von vorn :D

Hier ist meine Schleife:

  private void startTimer()
{
    timerLooper.scheduleAtFixedRate(new TimerTask()
    {
        @Override
        public void run()
        {
            zeitspanne.setTimeInMillis(System.currentTimeMillis());
            milliSekundenOld = Integer.parseInt(formatMillies.format(zeitspanne.getTime()));
            sekundenOld = zeitspanne.get(Calendar.SECOND);


            Langelaufzeitaufgabe1(); (1)
            Langelaufzeitaufgabe2(); (2)
            zeitspanne.setTimeInMillis(System.currentTimeMillis());
        }
    }, DELAY_INTERVALL, INTERVAL_MINUTE - (zeitspanne.get(Calendar.SECOND) - sekundenOld)); (3)
} //INTERVAL_MINUTE = 59000 (59 Sekunden)

So bei (1) wird wie bei (2) ein sortierungsalgorithmus starten, welcher viel Zeit in anspruch nimmt.
Und die Zeit die (1,2) brauchen, wird dann bei (3) von der Minute abgezogen. Um die die Zeitverschiebung zu vermeiden, würde man das weglassen und wir nehmen mal an er braucht für (1,2) 2 Sekunden, dann würde sich die Schleife immer um 2 Sekunden zurück verschieben. Und das habe ich nämlich mit (3) gelöst. Nun meine Frage war, ob ich (1,2) in einen neuen Thread starten kann und somit die (3) weglassen kann, sodass er die Arbeit dann pararell mit dem Timerlooper vollzieht. Tut mir leid das ich mich nicht besser ausdrücken konnte, habe das spät am Abend gepostet.
Trotzdem danke für die Antworten.

Liebe Grüße subrim

Antworten
  • Forum-Beiträge: 2.599

12.01.2017 11:59:22 via Website

Ich erlaube mir mal was Anderes ins Spiel zu bringen :

Warum nimmst du dir nicht zwei AsyncTasks ?
Das dort oben ist für Deinen Fall ein wenig abenteuerlich - hast Du aber selbst schon festgestellt , dass
damit schnell die Grenzen erreicht sind.

Damit hättest du Überblick , wann welches wirklich fertig ist und kannst somit deine Zeit genauer kalkulieren
(incl Parameter-Übergabe und Rückgabe)

Zumal diese dann parallel laufen können, wenn Diese mit executeOnExecutor gestartet werden ..

— geändert am 12.01.2017 12:00:50

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

12.01.2017 12:12:24 via Website

Ok, die Idee hatte ich auch. Das probiere ich gleich direkt mal aus. Nun da ich aber die Schleife jede Minute ausführen möchte (Schleife läuft im Service) und aus irgendwelchen Gründen die Schleife einfach mal Beendet wird (Was ich übrigens schon mal hier gepostest habe), hab ich das eigentliche Problem immer noch an der Backe. Ist es überhaupt auf Android möglich eine Endlos-Schleife in einem Service laufen zu lassen, die wirklich nicht beendet wird oder werden kann ?

Antworten
  • Forum-Beiträge: 2.599

12.01.2017 12:41:31 via Website

Ist es überhaupt auf Android möglich eine Endlos-Schleife in einem Service laufen zu lassen, die wirklich nicht beendet wird oder werden kann ?

Wie darauf schon mal (wahrscheinlich) geantwortet : Nein :-)

Android ist nicht dazu konzipiert, endlos-Threads im Background laufen zu lassen.
Dazu haben sich jede Menge schlaue Leute Gedanken gemacht, damit man das nicht machen kann
- Warum dann doch aushebeln ?

Möglichkeiten des Work-Around :

a) Du musst Dir ein Jojo bauen ( stopSelf) und mit dem AlarmManager synchronisieren.
b) Du lagerst den Service als Process aus
http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html
c) Du machst einen Foreground service , der kann aber auch vom System beendet werden

— geändert am 12.01.2017 12:48:11

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

12.01.2017 13:01:45 via Website

Hmm danke für die hilfreiche Antwort, aber wie macht z.B Whatsapp das? Die müssen doch auch ständig Nachrichten vom Server abrufen oder nicht ? Und ich nehme mal an das sowas jede Sekunde passiert oder liege ich da falsch?
Oder der Alarmmanager, der muss ja auch immer ständig überprüfen ob an dieser Uhrzeit ein Alarm regiristriert wurde usw. Ich versuche schon seit 4 Montaten einen Service für die App zu programmieren, der mich erinnert. Es ist eine Erinnerungsapp, nur nichts will irgendwie funktionieren. Meistens sind die Sachen einfach total ungenau wie der Alarmmanger, trotz setExact.

Antworten
  • Forum-Beiträge: 2.599

12.01.2017 13:05:14 via Website

Hmm danke für die hilfreiche Antwort, aber wie macht z.B Whatsapp das? Die müssen doch auch ständig Nachrichten vom Server abrufen oder nicht ? Und ich nehme mal an das sowas jede Sekunde passiert oder liege ich da falsch?

Entweder das oder man kann Push-Techniken verwenden wie z.b. FCM.
Das sind aber dann Techniken (FCM) , die auf die Ausnahmen zugreiffen und vom System unterstützt werden,
an die du dann als App Entwickler nicht heran kommst , es sei denn du gehst in die Tiefe ( root)
https://firebase.google.com/docs/cloud-messaging/

Unter Root kannst du natürlich (Linux) alles Mögliche machen , auch z.b. ein C++ Deamon.
Aber nicht mit dem Zygote ( Java VM / Wrapper ) und auf den hast du dann als "Normalo" nur Zugriff

P.S Dir steht es frei , doch mal für die Hilfen auch ein paar mal den Danke - Knopf zu drücken :-)

— geändert am 12.01.2017 13:09:58

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

12.01.2017 13:14:46 via Website

[[cite swa00]]
Entweder das oder man kann Push-Techniken verwenden wie z.b. FCM.

Also geht es doch irgendwie? Weil das kann doch nicht so schwer sein einen erinnerungsservice zu programmieren...
Ich meine die anderen haben es ja auch irgendwie auf die Kette gekriegt. Außerdem würde ich gerne ohne Internetzugang auskommen.

— geändert am 12.01.2017 13:19:52

Antworten
  • Forum-Beiträge: 2.599

12.01.2017 13:18:34 via Website

MOMENT !!!

Das ist kein ErinnerungsService , das ist ein Push Service ... Das hat NICHTS mit Endlos Threads als
Service unter Java zu tun - das ist ein C++ Basierter Deamon im Linux Image.

Wenn du mit Erinerungsservice den Alarmmanger meinst - das habe ich ja oben schon als Work-Around
erwähnt - das ist aber auch kein endlos-Service.

Außerdem würde ich gerne ohne Internetzugang auskommen.

Kannst du doch - aber dafür musst du unter Linux deinen Daemon entwickeln und ihn unter Root ausführen.

Java unter Android ist der völlig falsche Ansatz , für das was du vorhast

— geändert am 12.01.2017 13:23:21

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

12.01.2017 13:29:06 via Website

Ich glaube wir reden gerade aneinander vorbei. Mit "Erinnerungservice" meinte ich einfach ein Service der so eine Funktion erfülllt, wie einen an etwas erinner das in einer Datenbank o.ä abgespeichert wurde. Ich meine bräuchte doch Internet für diese Push Benachrichtigungen oder nicht? Und da ich die App irgendwann mal veröffentlichen möchte, bräuchte der Nutzer doch dafür Root? Könnten Sie mir einfach Links zu diesem Thema schicken, damit ich besser weiß worum es hier gerade geht.(silly)

Antworten
  • Forum-Beiträge: 2.599

12.01.2017 13:32:24 via Website

Ich glaube wir reden gerade aneinander vorbei.

Yupp tun wir , denn ich stelle eben fest , dass du das Thema ein wenig gewechselt hast :-)

wie einen an etwas erinner das in einer Datenbank o.ä abgespeichert wurde.

Wo soll denn die DB liegen ???

Zum Thema Deamon und Root : Das bezog sich ausschliesslich auf deinen EndlosThread

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

12.01.2017 13:47:44 via Website

Zum Thema Deamon und Root : Das bezog sich ausschliesslich auf deinen EndlosThread

Ah jetzt verstehe ich, das mit dem deamon ist ja schön und gut, mein frage wurde damit beantworter. Aber das kann ich ja wie Sie gesagt haben nicht als Entwickler machen. Zu der Datenbank:
Diee erinnerungen werden dort gespeichert und dann sollteb sie halt von der Schleife ausgelesen und auf due Uhrzeit/Darum überprüft werden.

Antworten
  • Forum-Beiträge: 2.599

12.01.2017 13:52:34 via Website

Auch da muss ich nochmal nachhaken.

Welche Erinnerungen meinst du denn ? Die man im Calender eintragen kann ?

Wenn ja , dann schickt dir das System einen entsprechenden Trigger ( AlarmManager)
Du brauchst dann keine "Schleife" ....
https://developer.android.com/reference/java/util/Calendar.html

Wenn nein , wer trägt denn dann die Erinnerungen wo ein ?

Liebe Grüße - Stefan
[ App - Entwicklung ]

subrim

Antworten
Gelöschter Account
  • Forum-Beiträge: 47

12.01.2017 14:20:31 via Website

Ja das habe ich anfangs versucht, doch der Alarmmanager ist ungenau und manchmal meldet er sich garnicht. Selbst wenn ich ein wakelock anforder. Und da ich blicke in die datenbanken anderer erinnerung apps bekommen habe, konnte ich daraus ablesen das sie das mit dem Alarmmanager machen. Konnte aber leider nicht herausfinden warum es bei denen jedesmal auf die minute genau ist und es keinerlei ausfälle gibt. Und aus dem grund kam mir halt so die idee einfach eine schleife laufen zu lassen, die jede minute dann die datenbank nach erinnerungen überprüft: Sprich wenn wir 21:00 haben und eine übereinstimmung der uhrzeit gefunden wurde, wird die erinnerung mithilfe einer notification angezeigt.

Antworten