AsyncTask Problem

  • Antworten:45
Jakob N.
  • Forum-Beiträge: 282

19.07.2014, 17:11:45 via Website

Hallo!

Ich bin heute leider auf einen Fehler in meiner App gekommen. Ich starte zirka 5/6 (ist immer unterschiedlich) AsyncTasks hintereinander, die Daten über PHP in die Datenbank schreiben.

Mein Problem: Manchmal gelangen die Daten eines AsyncTasks nicht in der Datenbank. Wie kann ich das beheben?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.07.2014, 17:47:23 via App

Wie sieht denn dein Code dazu aus?

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

19.07.2014, 20:26:26 via App

Rufe den AsyncTask in einer Schleife auf mit jeweils 3Parameter diese ich dann in die DB poste.

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.07.2014, 20:31:20 via App

Versuch das mal gescheit zu debuggen sowohl auf der android seite als auch im php.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

19.07.2014, 21:32:16 via App

Hmm oke! wie kann ich das zugleich debuggen?

Sollte man eigentlich vor dem Starten eines AsyncTasks prüfen ob eine Internetverbindung vorhanden ist?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.07.2014, 22:27:15 via App

Also vlt wollte mwn das schon überprüfen. Sonst kommst du hakt mal in einen timeout.
Debuggen mit log.d etc.
Oder mit brakepoints in eclipse

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

19.07.2014, 23:17:06 via App

Was meinst du mit mwn?

Und wie kann ich PHP debuggen?

LG Jakob

LG Jakob

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

20.07.2014, 04:03:07 via App

was er sagen wollte Ja die Internetverbindung prüfen. und dein PHP script kannst du nicht debuggen. Kannst aber ne log file erstellen lassen ob ein Zugriff erfolgt ist.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.07.2014, 06:33:13 via App

Du kannst zwar php nicht richtig debugfen.
Ausgaben werden meistens elreuchen.
Die küsstest du dann ausweten.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.07.2014, 14:30:46 via App

Oke danke!

Wie soll ich das machen wenn keine Internetverbindung vorhanden ist? Die Daten irgendwo abspeichern?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.07.2014, 14:37:40 via Website

Ja, die Daten müssen solange dann in einer Lokalen DB oder in den Shared Preferences gespeichert werden, bis die app wieder eine internetverbindung hat.

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

Antworten
Georg C.
  • Forum-Beiträge: 235

20.07.2014, 16:42:20 via Website

PHP kan man ("vom Haus";) mit Noticen .... und .... print_r ... und ... debuggen.
Die Zend IDE enthält einen Debugger, es existieren viele freie Debugger (APD oder Xdebug ) wie auch zeilreiche Debugg- Extensions wie DBG.

LG
Georg

Sorry für Gramatik & Stilistik Fehler.

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.07.2014, 18:00:40 via App

Wie mach ich das dann aber wenn der AsyncTask als Subklasse in einer Activity ist? Wann soll ich die Daten in die DB speichern?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

20.07.2014, 18:36:28 via Website

Der AsyncTask sollte am Besten eine Eigene Klasse sein.
Das speichern sollte erfolgen, sobald das Internet wieder da ist.
-> Broadcast Receiver auf den Internetstatus

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

20.07.2014, 22:00:15 via App

AsyncTask habe ich deswegen als Subklasse da ich in wenn fertig geinserted wurde noch etwas machen will.

Also Daten in SharedPreferences oder lokale DB speichern und dann im BroadcastReceiver verarbeiten? Was würdest du besser finden? lokale DB oder SharedPreferences?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.07.2014, 06:53:29 via App

Mir ist das egal du musst das entscheuden da ich die Art +Format der Daten nicht kenne.
Auch wenn der Task ferig ist iannst du sachen weiterlaufen lassen.
Wozu gibts sonst noch die onPostExecute Methode.
Zudem könntest du noch callbacks in deine Activity einbauen.
Dann ist die Subklasse weg.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

21.07.2014, 12:19:18 via App

Was meinst du mit Callbacks?

LG Jakob

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

21.07.2014, 17:24:13 via App

Kann man eigentlich mehrere HttpPosts in einem AsyncTask abschicken?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.07.2014, 17:25:34 via Website

Kannst du schon, aber was bringt dir das?

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

21.07.2014, 17:28:20 via App

weiß ich auch nicht. Ich will nur vermeiden dass Daten verloren gehen

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.07.2014, 17:29:52 via Website

Kannst du ja, indem du sie zwischenspeicherst.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

21.07.2014, 17:35:34 via Website

Ich glaube dass is viel Aufwand :P

Werde es jedoch mit einer lokalen DB versuchen.

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.07.2014, 17:46:19 via Website

Warum sollte sowas viel Aufwand sein, du solltest halt auf dem Server prüfen, ob die Daten vollständig sind, und dann dem Client bescheid geben, dann hast du die Datensicherheit.

Wenn etwas fehlt oder nicht Korrekt ist, dann soll der Client die Daten erneut schicken.

Wenn keine inet Verbindung besteht, dann sollte das Gerät die Daten in einer lokalen DB abspeichern.
Besteht die Verbindung wieder, werden sie Daten zum Server geschickt.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

21.07.2014, 19:22:08 via App

Habe noch nie mit einer lokalen DB gearbeitet ...

LG Jakob

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

22.07.2014, 20:16:17 via Website

Was hat es mit den Versionsnummern auf sich?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

22.07.2014, 20:26:03 via Website

Was meinst du?

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

Antworten
Sven R.
  • Forum-Beiträge: 1.904

22.07.2014, 21:17:25 via App

Eine Versionsnummer ist, meines Wissens nach, zur Kompatibilitätsüberprüfung unter den Datenbanken da.
Ich weiß aber nicht mehr, wie das genau funktioniert. Musst mal googlen.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Jakob N.
  • Forum-Beiträge: 282

22.07.2014, 22:30:31 via App

public class DatabaseHandler extends SQLiteOpenHelper {    
 // All Static variables    
// Database Version    
private static final int DATABASE_VERSION = 1; 

.. hier zB und die wird dann beim Konstruktor mitgegeben.

LG Jakob

LG Jakob

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

23.07.2014, 04:32:01 via App

sie dient dazu wenn du deine Datenbank um spalten erweiterst ober änderst. Das du abfragen kannst auf welchen stand deine DB ist damit keine Quatsch in ihr entsteht.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Jakob N.
  • Forum-Beiträge: 282

23.07.2014, 22:12:43 via App

Daas bedeutet immer wenn man an die creates etwas ändert, sollte man die Version erhöhen?

LG Jakob

LG Jakob

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

23.07.2014, 22:16:31 via App

du änderst sie wenn du eine Erweiterung deiner Tabelle vorhast. Also nicht bei create sondern ALTER TABLE.
Du musst vorher halt prüfen in welcher Version der Benutzer steckt. Da du eine existierene DB nicht überschrieben kannst.

— geändert am 23.07.2014, 22:18:27

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Jakob N.
  • Forum-Beiträge: 282

24.07.2014, 14:17:55 via App

Oke verstehe! Danke :)

LG Jakob

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

11.08.2014, 16:46:11 via Website

Hallo! :)

Habe die Daten jetzt in der lokalen DB soweit gespeichert.

@Pascal: Du hast ja erwähnt, dass ich den AsyncTask als eigene Klasse machen soll (keine Sub-Klasse). Ich starte jedoch in der aufrufenden Klasse/Activity (die den AsyncTask aufruft) einen Lade-Dialog der erst wieder gecancelt werden soll, wenn die Daten in der DB gespeichert sind. Wie kann ich auf das Objekt zugreifen?

Und noch etwas, ich hole mir die Daten von der lokalen DB in eine Liste. (List<Typ>;). Soll ich die Liste dann nur mit einer Schleife starten, und für alle AsyncTask.execute(...) aufrufen?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.08.2014, 18:17:04 via App

  1. Da wirst du wohl um ein Callback nicht herumkommen. Kannst ein Interface benutzen.

  2. Keine Ahnung vlt mal beides testen und schauen was schneller bzw. code effizienter ist

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

11.08.2014, 21:22:11 via App

Wie genau meinst du das mit Interface?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.08.2014, 22:35:27 via App

Frag Google nach Java Interface dort bekommst du deine Erklärung.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

11.08.2014, 22:53:23 via App

Ich weiß schon was ein Interface ist. Weiß jedoch nicht wie ich es in diesem konkreten Fall einsetzen soll.

LG Jakob

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

13.08.2014, 13:29:22 via Website

Ich verstehe dass noch immer nicht ..
Soll dann der AsyncTask das Interface implementieren. Und das Interface enthält eine Methode die dann in der Activity den Lade-Dialog cancelt?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.08.2014, 14:17:39 via App

Genau. Du musst nur Das Interface Richtig nutzen und was verstehst du daran nicht?

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

13.08.2014, 14:41:56 via Website

Eben genau wie ich das Interface richtig nutzen muss, damit ich das erwünschte Ergebnis bekomme.

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.08.2014, 15:02:35 via App

Es gibt im Internet genug Anleitungen dazu. Du musst nur die richtige Finden.
Eigentlich musst du das Interface instanzieren und dann deinem Async task übergeben.

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

Antworten
Jakob N.
  • Forum-Beiträge: 282

13.08.2014, 19:47:33 via Website

Besten Dank!

Noch etwas wegen der Internetverbindung überprüfen. Ich mache, dass in der Methode "onPreExecute()". Was soll ich jedoch machen wen keine Internetverbindung besteht? wie kann ich den asynctask abbrechen?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

13.08.2014, 20:16:07 via App

Ich würde den Async Task eh erst starten wenn eine Internet Verbindung besteht.

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

Antworten