Hmm, interessanter Hinweis, der Menüpunkt war mir bisher noch gar nicht untergekommen... Leider bringt das auch nichts. FALLS es also nicht das WLAN ist, was Probleme macht, was kann es dann sein? Dass generell Netzwerktransfer beenden wird? Wie ließe sich das umgehen, muss ich dann z.B. mit Services im Hintergrund arbeiten?
Beiträge von fargotof
-
-
Hallo zusammen,
für einen rein privaten Anwendungsfall baue ich aus meiner App heraus über WLAN eine Socket-Verbindung auf einen Server in meinem lokalen Netzwerk auf, der mich "asynchron" über die Veränderung bestimmter Werte informiert. Bei mehreren (aber nicht allen) getesteten Devices reißt die Verbindung ab, wenn das Device in Standby geht. Ich bin mir jetzt nicht ganz sicher, ob da evtl auch das WLAN abgeschaltet wird, aber das kann ja eigentlich nicht sein, da sonst ja diverse Apps im Standby nicht laufen könnten (es sei denn, es würde jedesmal auf mobile Daten umgeschaltet).
Wie ist die grobe Vorgehensweise, um dieses Problem zu vermeiden?
Danke und Grüße
-
Hallo zusammen,
ich habe aktuell eine Klasse DataModel, in der ich unter anderem in einer ArrayList einige Elemente meiner Klasse Player halte. Dessen Eigenschaften Name und Points würde ich gern in ListView darstellen, bin mir aber ob der scheinbaren Vielzahl an Möglichkeiten ob der "besten" Vorgehensweise nicht sicher.
Im ersten Schuss würde ich zur Anzeige simple_list_item_2 verwenden, fraglich ist somit eher, über welche Art Adapter ich die beiden textViews befülle. Kann / sollte ich als effektivste Variante eine Cursor-Abfrage auf meine ArrayList machen, oder gibt es bessere Wege? Und sollte ich die Spieler überhaupt als Objekte in einer ArrayList speichern, oder gibt es Strukturen, die schnelleren Zugriff erlauben? Die Daten verändern sich dynamisch zur Laufzeit und müssen außer zur Anzeige eigentlich nicht gespeichert werden...
Danke und Grüße,
FargoTof -
Naja, Google (also der Suche ;)) sei Dank ist es ja nicht so, dass ich die Vorgehensweisen nicht in irgendwelchen Tutorials, ... gefunden hätte. Ich bin nur etwas irritiert, dass sich nichts dazu in den API-Guides (also http://developer.android.com/guide/components/index.html ) findet, in denen es ja eigentlich zu jedem "wichtigen" Thema eine praktische Einführung gibt...
Z.B. das Versenden von SMS via SmsManager sehe ich ehrlich gesagt nirgends erläutert..?
-
Moin moin,
sagt mal, sind die "normalen" Telefonfunktionen wie Versenden von SMS, Wählen von Nummern, ... in keinem API Guide beschrieben? Muss man sich die gängigen Vorgehensweisen da komplett selber zusammensuchen? Oder bin ich nur grad irgendwie blind?
Danke + Grüße,
FargoTof -
Hallo zusammen,
ich bin mittlerweile ein gutes Stück vorangekommen, stehe aber noch vor einem kleinen Problem. Aktuell nutze ich zum Parsen eines via Socket hereinkommenden XML-String der Form
HTML<Data> <Number>12345</Number> <Values> <Value1>false</Value1> <Value1>true</Value1> <Value1>false</Value1> </Values> </Data>
einen ganz normalen XMLReader. Dafür öffne ich in einer Runnable erst den Port, setze InputStream usw. und parse dann in einer Endlosschleife:
Java
Alles anzeigenprivate Runnable runnable = new Runnable() { public synchronized void run() { try { // Socket öffnen, Streams setzen, ... } catch (Exception e) { logger.log(Level.INFO, "IOException while creating the socket"); return; } while (true) { if(Thread.interrupted()){ logger.log(Level.INFO, "Thread.interrupted"); return; } try { getElement(); } catch (Exception e) { // TODO: handle exception } } } }; protected String getElement() throws IOException, InterruptedException, SocketTimeoutException { try { xmlreader.parse(src); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; }
Da meine Klasse als ContentHandler fungiert, kann ich über die Methoden public void startDocument () usw. die Ereignisse des Parsers abfangen und entsprechend reagieren.
Simulieren tue ich die Gegenstelle im Moment, indem ich mich von einem Laptop per netcat auf den geöffneten Socket verbeinde und dann die Daten einfach über den Socket schiebe. Jetzt gibt es drei Fälle:
1. Ich schicke "Zeile für Zeile", also je bestätigt durch Drücken von ENTER
2. Ich schicke das Ganze "in einem Rutsch", also füge in der Konsole alles ein --> Die CR/LF sorgen ja dafür, dass alle bis auf die letzte Zeile auch schon einzelnen gesendet werden; die letzte Zeile übertrage ich dann per ENTER
3. Ich füge vorm Einfügen in die Konsole bereits eine weitere leere Zeile an, sodass auch hinter meiner eigentlich letzten Zeile noch ein CR/LF steht und auch diese schon mitübertragen wird.Diese drei Vorgehensweisen führen jetzt auch schonmal grunsätzlich zu verschiedenen vom Parser geworfenen Ereignissen:
1. Das "</RobotData>" wirft ein startDocument (aber weder ein endElement, noch ein endDocument)
2. dito
3. Das "</RobotData>" wirft immerhin ein endElement (aber immer noch kein endDocument).Was kann es denn erstens mit diesen unterschiedlichen Verhaltensweisen auf sich haben und vor allem: Wie kriege ich es korrekt hin, sodass ich wirklich alle Ereignisse mitkriege?
Viele Grüße,
FargoTof -
Hallo zusammen,
ich möchte demnächst ein einfaches XML-Protokoll über eine Socket-Verbindung serverseitig implementieren. Das ist zunächst also ein "unverzweigtes" Frage-Antwort-Spiel also z.B sowas wie
PHP
Alles anzeigenS: <Hello/> C: <Hello/> S: <Request id="1"><GetInfo/><Request> C: <Response id="1"><Info name="Hans Wurst" type="tralala"/> ... C: <Request id="100"><GetValueXYZ/></Request> S: <Response id="100"><Data name="XYZ" val="12345"/> ... C: <Bye/> S: <Bye/> ENDE.
Frage ist: Wie implementiert man so etwas im Allgemeinen? Grundsätzlicher Ansatz ist mir klar, ich würde auf dem Inputstream lauschen (zB in einer Runnable), jeweils in von öffnendem und schließenden Tag eingeschlossene Brocken aufteilen, und gleichzeitig über einen Outputstream Daten rausschreiben. Nur: Gibt es da einen generellen Ansatz, wie man "das Protokoll als solches" handelt? Klar ist, dass ich parsen muss, wie und wo halte ich mir aber z.B. den aktuellen Stand der Kommunikation (also hat der Client schon "Hello" gesagt) und wie entscheide ich, auf welche Frage ich was antworte? Es muss ja eine Art Protokoll-Handler geben, gibt es da Standard-Herangehensweisen? Literatur?Viele Grüße,
FargoTof -
Hey,
danke für die Antwort! Leider habe ich sie nicht 100prozentig verstanden. Ich habe mir mittlerweile tatsächlich die Oberfläche etwas umgestaltet, sodass ich "nur" noch 3 Tabellenspalten und somit gute 100 Buttons habe + 2 weitere Buttons, mit denen ich dann durch die Tabelle "blättere", im Prinzip verwende ich also Buttons wieder und unterscheide deren Verhaltensweise dann über eine Variable, die mir sagt, wo ich hingeblättert habe.
Das Problem bleibt aber soweit natürlich ungelöst, d.h. die Performance bleibt jetzt zwar etwas länger hinnehmbar, irgendwann gehts aber trotzdem bergab.
Interessant wäre daher nochmal dein Lösungsansatz mit FIFO:
- Damit ich Buttons wirklich wiederverwenden kann, also auch nach Neustart der Activity, müssten Sie ja auch außerhalb dieser gespeichert werden, richti? Wo denn am besten?
- Auf welche Art und Weise könnte man denn dann immer "den letzten Button rausfallen" lassen, also so, dass er den Speicher auch wirklich freigibt? Weil exakt das ist ja eigentlich bereits jetzt mein Problem..
Grüße,
FargoTof -
Naja, ich erstelle sie halt aktuell beim Aufrufen der Activity, sprich in der onCreate. Und richtig, ich beende ja mit finish(), was offensichtlich wie du sagst nicht zwingend was nützt
--> Wie könnte man des denn grundsätzlich überhaupt anders machen (also wenn ich sie nicht jedes mal laden will, muss ich ja woanders speichern...)?
--> Von diesem Fall abgesehen: Meine Buttons repräsentieren u.U. bei jedem Start der Activity einen anderen Umfang an Daten, es muss also "dynamisch" entschieden werden, wieviele es sind, was bei Click passiert, ... spätestens dann kriege ich also auch bei "ausgelagerten" Daten Schwierigkeiten, oder? Blöd, blöd das... -
Naja, dass ich vom Layout als solches kein Performance-Wunder erwarten kann, ist mir schon klar, allerdings läuft ja beim ersten Start noch alles hinreichend flüssig.
Erst mit jedem Beenden und Neustarten der Activity wird der Speicher immer voller (und eben das verstehe ich halt nicht: Werden die Buttons beim Beenden nicht entfernt? Und falls nein: Warum werden sie es selbst dann nicht, wenn das Device offensichtlich überlastet ist?) und die App gleichermaßen immer träger...
Kann man dem tatsächlich nicht entgegenwirken (das Löschen wirklich erzwingen, ...)?
-
Hi,
ich verstehe ehrlich gesagt deine Frage nicht ganz Ich würde aber mal mit "ersteres" antworten. Ich habs zwar bisher noch nicht auf die Spitze (sprich bis zum Absturz) getrieben, aber ich habe halt die Symptome:
- Der Speicher wird immer voller
- Das System / meine App wird immer unperformanter.Ob ersteres Symptom zweiteres bedingt, weiß ich nicht, könnte ich mir aber vorstellen. Frage ist nun: Wie beheben?
Grüße,
FargoTof -
Hallo zusammen,
ich hätt´ da mal wieder ne Frage Und zeige ich in einer Activity u.a. wirklich viele Buttons innerhalb einer ScrollView an (programmatisch erzeugt), kann man sich als Tabelle vorstellen, ca. 30*30 Buttons. Bei ihrem ersten Aufruf ist das Ganze trotzdem noch sehr performant, man kann zB. flüssig scrollen.
Wenn die Activity nun beendet wird (onDestroy wir aufgerufen) und anschließend neu gestartet wird, geht der Speicherbedarf der App immer weiter in die Höhe und die App wird immer unperformanter:
GC_FOR_ALLOC freed 1762K, 6% free 39425K/41607K, paused 242ms
Ist das nicht eigentlich ein Fall für den Garbage Collector? Ich meine ich muss mich doch an sich nicht darum kümmern, den von den Buttons belegten Speicher beim Beenden der Activity wieder frei zu machen, richtig? Aber irgendwie daran scheint es ja zu liegen....
Grüße,
FargoTof -
Hmmm, irgendwie wurde der Beitrag hier (automatisch?) auf erledigt gesetzt... Ich bin allerdings nach einer kurzen Pause immer noch an einer Lösung / Hinweisen interessiert, daher pushe ich mal
Freue mich auf Antworten, Danke + Grüße!
EDIT: Ah, jetzt isses wieder unerledigt
-
Hallo zusammen,
ich habe ein seltsames Verhalten mit einem RelativeLayout (ihr könnt es am besten anhand angehängten Grafiken nachvollziehen, da hat sie nen türkisen Hintergrund) innerhalb einer ScrollView (dito, blauer Hintergrund):
Java
Alles anzeigen<ScrollView android:id="@+id/tablecelltop" android:layout_height="150px" android:layout_width="fill_parent" android:layout_alignParentBottom="false" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_marginLeft="100px" android:layout_below="@+id/buttonDeleteSequence" android:isScrollContainer="true" android:background="#0000FF"> <RelativeLayout android:id="@+id/relativeLayout2" android:layout_width="wrap_content" android:layout_height="150px" android:background="#00FFFF"> </RelativeLayout> </ScrollView>
Ich möchte dort in mehreren Schleifendurchläufen jeweils 3 Buttons untereinander im Layout platzieren:
Java
Alles anzeigenmyEditButton = new Button(this); myEditButton.setX( (myStep.getNumber() -1) * cellWidth); myEditButton.setY(0); myEditButton.setText("edit"); myDimmtimeButton = new Button(this); //... myTriggerButton = new Button(this); //... myTopLayout.addView(myEditButton); myTopLayout.addView(myDimmtimeButton); myTopLayout.addView(myTriggerButton);
Seltsamerweise wird mir bei wrap_content das Layout nur so breit gezogen, wie der breiteste Button des ersten Schleifendurchlaufs (s. Bild 1), und das auch nur, wenn ich ihn nicht zusätzlich über .setX nach rechts verschiebe (siehe Bild 2).
Die Buttons des zweiten Schleifendurchlaufs sind vorhanden (das sehe ich, wenn ich einen Button des ersten Durchlaufs künstlich verbreitere, siehe Bild 3), liegen aber eben außerhalb des "sichtbaren Bereichs"
Was muss ich ändern, damit dieses programmatische Laden der Buttons korrekt funktioniert?
Vielen Dank schonmal und viele Grüße!
FargoTof. -
Hi,
danke, nähreres hierzu kannst du aber nicht sagen, also etwas zu deiner "Grundidee"? Problem ist aktuell ja nicht, dass ich nicht verschiedene Threads hätte, sondern vielmehr, dass ich meine ArrayList während des Iterierens verändere.
Vllt ist ja auch das dauerhafte Iterieren als solches ein unsinniger Ansatz, allerdings wüsste ich nicht, wie ich meine Nachrichten sonst am besten abschicke (MEINE Idee ist ja, meinen Jobs nach Erhalt der "ACK"-Botschaft jeweils mitzuteilen, dass sie wieder senden dürfen, und während meines o.g. Iterierens eben darauf prüfe und wenn möglich sende).
Grüße,
FargoTof -
Guten Morgen,
ich habe mein Problem mitlerweile halbwegs gelöst, allerdings wirft das direkt neue Fragen auf.. Ich habe mir für meinen JobHandler jetzt eine private Runnable angelegt, die einfach in Endlosschleife für nacheinander für alle Jobs prüft, ob für deren aktuelle Nachricht schon bestätigt wurde und somit gelöscht werden kann:
Java
Alles anzeigenpublic void run() { while (true) { for (Job myJob : jobs) { // Wenn Job Idle ist (noch kein NACK empfangen bzw. ACK empfangen --> nächste Botschatf kann gesendet werden!) if (myJob.getState() == Job.State.STATE_IDLE) { // Erste Botschaft des Jobs dem Sendebuffer hinzufügen myJob.setState(State.STATE_BUSY); } } } }
Der Job bleibt also so lange auf BUSY, bis er ein ACK empfangen hat, aber das nur am Rande. Problematisch wird es nun, wenn ich meinem JobHandler neue Jobs hinzufüge, also:
Dann kommt nämlich das durchiterieren von jobs in meiner Endlosschhleife durcheinander und es gibt eine Exception
Code03-27 08:51:45.880: E/AndroidRuntime(1693): java.util.ConcurrentModificationException 03-27 08:51:45.880: E/AndroidRuntime(1693): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) 03-27 08:51:45.880: E/AndroidRuntime(1693): at de.meineFirma.JobHandler$1.run(JobHandler.java:55)
Ich könnte mir vorstellen, dass ich bestimmte Abschnitte als "synchronized" setzen muss, weiß aber nicht welche bzw. ob dies wirklich der richtige Weg ist (bei dem ich mir nicht wieder andere Sachen seltsam blockiere).
Hat hier jemand Rat für mich?
Danke und Grüße,
FargoTof -
Hallo zusammen,
ich haette da mal wieder eine Frage zu meiner Klassenarchitektur:
Ausgangssituation:
Ein Objekt meiner Klasse AppModel besitzt einen bestimmten Datenstand (mehrere Datensätze, jeweils mit Versionsnummer)
Ein entfernter Server besitzt ebenfalls einen bestimmten Datenstand (analog oben)
Zwischen beiden erfolgt eine Kommunikation über ein eigenes, asynchrones Protokoll (via Socket), z.B.:- App kann Versionsstand anfragen (sendet 1 Botschaft), "irgendwann" kommt die Antwort.
- App kann Datenstand aktualisieren (sendet je nach Umfang des Datenstandes 1-x einzelne Botschaften), "irgendwann" kommt Antwort "ok" o.ä.Ziel:
Abgleich der Datenstände realisieren.Was besteht bisher:
- Ich habe eine Klasse Jobs definiert, die in einer ArrayList alle zu versendenden Botschaften enthält. Außerdem weiß ein Job, auf welche Antwortbotschaft er zu warten hat.
- Mehrere Jobs verwaltet der JobHandler. Er übernimmt das eigentliche Senden (holt sich die erste Botschaft aus dem Job, versendet sie, und löscht sie dann aus dem Job) und Empfangen (empfängt grundsätzlich alle Nachrichten und prüft dann, ob es einen Job gibt, dessen Nachrichten komplett versendet wurden, für den aber noch keine gültige Antwort empfangen wurde).
- Alle Objekte, die sich als Listener registriert haben, werden zB darüber informiert, dass ein Job (den sie evtl selber beim HobHandler platziert haben), abgeschlossen wurde (und was die Antwortbotschaft war).
Soweit der Plan. In der Umsetzung hapert es momentan an einer Stelle: Auch wenn ich zB aus meinem Model heraus die Jobs beim JobHandler platziere, weiß ich nicht, mit welchem Mechanismus ich über dessen Abarbeiten informiert werden kann, ohne umständlich prüfen zu müssen, auf WELCHER Job abgearbeitet wurde.
Was mir alternativ in den Sinn kam, aber nicht besonders sinnvoll erscheint, wäre etwas wie folgendes (Natürlich in einem seperaten Thread ausgeführt):
Java
Alles anzeigenmeineMethode(){ Job Versionsabfrage anlegen Job starten while(!JobIstBeendet); Version = Job.getErgebnis; if VersionIstKorrekt nichts tun else Job Versionsaktualisierung anlegen Job starten ... }
Was mich daran stört ist nicht nur, dass ich mich da u.U. irgendwie blockieren könnte, sondern auch, dass es Fälle geben kann, in denen ein "Callback-Mechanismus" wie oben reichen würde, also alle Listener über das abarbeiten eines Jobs informiert würden, aber eben nicht immer... und so ein Gemische erscheint mir arg fehleranfällig...
Ich hoffe, ihr könnt mein Problem nachvollziehen und habt ein paar Ideen für mich,
Viele Grüße,
FargoTof -
Hallo zusammen,
bin mir nicht sicher, ob die Frage hier reingehört, denke aber, dass jemand die Lösung zu folgendem Problem kennt..: In Eclipse habe ich unter
Preferences / Java / Editor / Content Assist
die "Auto activation triggers for Java" um alle Klein- und Großbuchstaben ergänzt (.(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ), damit mir z.B. auch Variablennamen etc. beim Tippen vorgeschlagen werden. Hat man nur den Punkt (".") wird ja nur dann die Liste mit den Vorschlägen geöffnet und auch nur solange man sich nicht z.B. bei einem Methodennamen versehentlich doch noch vertippt.
Leider hat das zur Folge, dass z.B. "int" häufig als ersten Vorschlag "integer" erzeugt und das dann auch automatisch eingefügt wird, wenn ich die Leertaste betätige.
Gibt es also eine Möglichkeit, dass mir zwar immer alles vorgeschlagen wird, aber nicht der erste / ausgewählte Eintrag automatisch eingefügt wird?
Grüße,
FargoTof -
Danke, einen Woraround habe ich mittlerweile auch schon gefunden, hab´s halt einfach an dem TextView ausgerichtet, an dem es funktioniert. Ging mir mehr darum, herauszufinden, ob´s ein Denkfehler ist oder nicht
Allerdings rät die Dokumentation doch statt zu sehr geschachtelten LinearLayouts zum RelativeLayout - überfordert sollte das ja also so schnell nicht sein?
Grüße,
FargoTof -
Hallo zusammen,
endlich wieder ein Problem! Und zwar kann ich eine SeekBar mit alignBottom nur an manchen (Text-)Views in meinem RelativeLayout ausrichten - folgendes funktioniert:
Code
Alles anzeigen<TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/colorname" android:layout_below="@+id/colorname" android:layout_marginTop="100dp" android:text="R" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/rval" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView3" android:layout_marginLeft="20dp" android:layout_toRightOf="@+id/textView3" android:text="255" android:textAppearance="?android:attr/textAppearanceLarge" /> <SeekBar android:id="@+id/seekBar001" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_alignBottom="@+id/textView3" android:layout_toRightOf="@+id/textView3" />
folgendes hingegen nicht:
Code... <SeekBar android:id="@+id/seekBar001" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_alignBottom="@+id/rval" android:layout_toRightOf="@+id/rval" />
Meine Seekbar wird dann zwar rechts von rval positioniert (horizontal also richtig), allerdings nahe des oberen Randes meines RelativeLayouts (vertikal falsch). Ich habe mein Projekt gecleant, neu angelegt, vereinfacht, verkompliziert, ... immer das gleiche Ergebnis... Was kann denn hierfür die Ursache sein, oder ist es - wie es mich sehr be(un?)ruhigen würde - ein Fehler?
Grüße,
FargoTofEDIT: Sieht dann so aus wie im Anhang: Obwohl kein margin angegeben ist, landet die SeekBar sonstwo... Ausrichten am "R" klappt, an der "255" nicht.