Beiträge von Marco Feltmann

    Auch hier würde ich sagen, dass du über Broadcasts gehen solltest.
    Einfach in deiner Activity einen Broadcast 'DidChangeSharedPreferenceForKey' mit dem Key feuern und dein Service lauscht auf eben einen solchen Broadcast.


    Dann lagerst du den relevanten Kram von der onCreate in eine 'initUserDefaults' aus und rufst diese einerseits in der onCreate und andererseits nach Erhalt des Broadcasts auf.

    Spontan: nö.
    Ist ja auch eigentlich nicht der Sinn und Zweck des asynctask. Der soll im Hintergrund Dinge tun und nicht im Hintergrund auf Dinge warten.


    Warum wirfst du nicht einfach einen Broadcast aus dem Service, wenn die Daten da sind und deine Activity startet den asynctask, sobald sie diesen Broadcast empfängt?
    (Ich hoffe, die Bezeichnungen sind korrekt für Java...)

    Ohne mich jetzt allzu gut mit den Cursorn auszukennen finde ich das sehr seltsam.


    In SQL machst du ja auch kein "SELECT * FROM table" und zählst dann manuell durch.
    Du machst ein "SELECT count(_ID) FROM table' und gut.


    Das müsste doch mit einem SQLiteDatabase.rawQuery("SELECT COUNT(_id) FROM table", null); darzustellen sein.
    Du bekommst dann zwar noch immer einen Cursor zurück, aber eben einen, der ausschließlich die Anzahl der Treffer beinhaltet.
    Und den kannst du dann auch losgelöst von allem anderen Krams wieder schließen.

    Könnte es an Breisach am Rhein liegen?
    Also dass das Parsing "ddddd ccccccc" nicht läuft, weil ' ' kein Char ist?
    Also meinetwegen '20095 Hamburg' läuft, '23556 Lübeck' läuft, '10119 Berlin' läuft, aber '29308 Winsen an der Aller' läuft nicht?
    Falls du das eingrenzen kannst, würde ich statt dessen einfach '79206 Breisach (Rhein)' probieren.

    [matthias]
    Naja, der tatsächliche Speicherverbrauch von so einer geöffneten Datenbank ist ja eher gering. Du hältst einen Pointer darauf und dieser hält irgendwie die Datenbank offen. Da die Datenbank eine Textdatei auf dem Dateisystem ist und nur Abfragen irgendwas in deinen Speicher pumpen, verschwendest du für so eine offen gehaltene Datenbank nicht allzu viel.


    Ich würde ja behaupten, wenn es am Speicher krankt, dann gehe man zunächst die unzähligen neu erstellten Objekte durch und kümmere sich erst im Anschluss (nach etlichen Messungen und so weiter und so fort) um offen gehaltene Referenzen. ;)


    [Funtik]
    Es hängt immer davon ab was genau du brauchst. Einige Objekte implementieren einen Konstruktor, dem du das Objekt mitgibst, welches sie kopieren sollen. (Arrays zum Beispiel).
    Sollte als das nicht klappen (der Cursor kann das gemäß Dokumentation nicht), dann können alle Objekte, die von Object abgeleitet sind, via .clone() eine Kopie erstellen.


    Ich bin wie Matthias auch der Meinung, dass dein Ansatz eventuell nicht der richtige ist.

    Also ich handhabe das gar nicht, da ich mich von den Datenbankinhalten so weit entfernt wie möglich bewegen möchte.


    Im Allgemeinen halte ich schließen und öffnen für die sinnvollste Variante, zumindest, wenn die Datenbank schreibbar geöffnet wurde.
    Meine Paranoia sagt mir nämlich, dass wenn irgendwas schief geht und die Datenbank beschreibbar offen war sie im schlimmsten Fall hin ist.


    Deshalb würde ich so weit es eben möglich ist die ReadOnly-Datenbank offen lassen, die beschreibbare Datenbank jedoch nach Einfügen der Datensätze (was idealerweise als Transaktion durchgeführt wurde) sofort wieder schließen und erneut ReadOnly öffnen.

    Zum Mac Problem:
    dir fliegt nix um die Ohren, dir kackt die ADB ab.
    Dagegen hilft: Emulator neu starten, wenn DDMS offen ist.


    Zum Linux Problem:
    adb sowie die ganzen Platform Tools liegen nicht in deinem Path.
    Und Windows wird dir da sicherlich auch nicht helfen. :P


    Zusatz:
    wenn du nicht auf dem Emulator, sondern auf dem Gerät arbeiten willst, kommst du in das /data Verzeichnis nur mit einem jailbroken device ran.
    Da kann aber weder der Mac noch dein Linux noch sonst ein OS irgendwas für. ;)

    Manchmal frage ich mich, woher ihr euer Grundlagenwissen nehmt und in welcher Art und Weise ihr eure Dokumentationen lest.


    Grundsätzlich und komplett losgelöst von Android bedeutet ein 'new' in Java genau das, was man erwartet: ein komplett neues und je nach gewähltem Konstruktor meist völlig leeres Objekt. Komplett neu und meist völlig leer. 'new' halt. Ungefähr so wie in 'Neuwagen', 'Neuigkeit', 'Neuerung', 'Neugier', 'erneuern' oder 'neumodisch'. Und halt ganz anders als 'Neuron', 'Neurose', 'Neunauge' oder 'pneumatisch'.


    Daraus folgt: new Intent() erstellt ein komplett neues, meist völlig leeres Intent.
    Und wenn du mir nicht glauben möchtest (das wäre natürlich dein gutes Recht), dann lies!

    Zitat

    Der unitäre new-Operator dient zum Erzeugen eines neuen Exemplars einer Klasse. Durch seine Verwendung wird ein neuer Speicherbereich belegt, der das neue Objekt aufnimmt.


    Ein Intent kommt erst dann in den Vordergrund, wenn du ihn via startActivity(Intent) startest. Das würde in deinem Fall dafür sorgen, dass sich eine neue Activity mit der selben Klasse deines MainActivityFragments vor dein sich im Hintergrund befindliches MainActivityFragment schiebt. Das Resultat für den Betrachter: seltsame Fehler, verschwundene Variablen etc.pp.


    Deine im Hintergrund befindliche Activity kommt zum Vorschein, wenn die im Vordergrund befindliche Activity via finish() beendet wird.


    Lange Rede kurzer Sinn: du willst keinen neuen Intent, sondern den aufrufenden Intent. Und den bekommst du in einer Activity via getIntent().
    getIntent() = hole Intent = nimm was Vorhandenes.
    new Intent() = neues Intent = erstell was Neues.

    Sieht nach einem typischen "You're doin' it wrong" aus.


    Java
    Intent i = new Intent(getApplicationContext(), MainActivity.class);
    i.putExtra("songID", songID);
    setResult(Activity.RESULT_OK, i);		
    finish();


    Du erstellst einen neuen Intent, machst da Dinge mit und beendest dann deine Activity.
    Dein neues Intent flattert also unbeachtet ins Nirvana.


    Anstatt einen neuen Intent zu holen solltest du lieber den aufrufenden Intent bearbeiten:

    Java
    Intent i = getIntent();
    i.putExtra("songID", songID);
    setResult(Activity.RESULT_OK, i);		
    finish();


    (Ja, getIntent() kann unter Umständen null zurückgeben, das musst du dann natürlich entsprechend abfangen.)

    :-! Moin, also ich werde gerade geringfügig irre.


    Die Dokumentationen zu BitmapDrawable und RotateDrawable hab ich jetzt 10x rauf und runter gelesen und ich komme auf keinen grünen Zweig.


    Auch die Links von Titus im MapView Thema habe ich mir mehrfach durchgelesen:der Ansatz ist verstanden, an der Durchführung hapert es.


    Folgende Situation:
    Ich habe eine Listview, in der ein paar Elemente sind. Aktuell sind es 33, es können aber auch gern mal das Hundertfache werden.


    Das Layout ist relativ simpel: rechts oben ein Textview, rechts unten ein Textview und Links eine eigene ViewGroup.
    Besagte ViewGroup beinhaltet aktuell auf Grund von einfacherer Darstellbarkeit nur ein TextView mit einem Drawable on top.


    Dieses Drawable ist ein simpler nach oben zeigender Pfeil aus einem PNG.


    Cell.xml:


    direction_view.xml:


    Wie zu erwarten wird beim Starten der App also eine Zelle angezeigt mit einem Point Of Interest, darunter dann die Koordinaten und links daneben ein nach oben zeigender Pfeil mit einer darunter liegenden Entfernungsangabe.


    Und egal was ich versuche, ich bekomme diesen dämlichen Pfeil nicht gedreht.


    Der Zugriff erfolgt ziemlich simpel:

    Java
    Drawable directionArrow = distanceTextLabel.getCompoundDrawables()[1];


    Jetzt habe ich eine BitmapDrawable, mit der ich gefühlt gar nix tun kann. Ich kann sie so nicht rotieren, ich kann sie nicht in eine RotateDrawable casten, ich kann (da sie in dem TextView steckt) nicht im XML als <rotate /> definieren und natürlich habe ich keine Ahnung, wie sich diese verdammte Graphik um ihre eigene Achse drehen lässt.


    Kann das denn echt so schwer sein? 8|


    Aus Performancegründen (wie bereits erwähnt: ca. 5000 Einträge sollten nachher möglich sein) möchte ich ungern für jede Rotation erst mal 17 Objekte hin und her erstellen. Wenn mir jemand einen hilfreichen Link zu einem Tutorial zeigen kann, der RotateDrawable im Code auf eine BitmapDrawable anwendet, wäre ich ihm dankbar. :)


    (Alle Resourcen scheinen sich um Animationen von gesamten Views zu drehen, niemals um simples Verarbeiten von Drawables. Nervig.)