Beiträge von Marco Feltmann

    Hi Tratorn,


    soweit ich JUnit verstanden habe, ist das nicht möglich. Die Unittests agieren nur auf Objektebene unabhängig einer Activity.
    Welches Tool für Integrationstests und UITests angesagt sind weiß ich allerdings nicht.
    Die Doku spricht von instrumentation und uiautomator...
    Vielleicht helfen dir die Links und Tutorials weiter:


    Testing Fundamentals
    Tutorial zum Activity Testing


    Aber zurück zum eigentlichen Thema.
    Bist du dir sicher, dass du Unit Testing richtig verstanden hast?


    Test Cases sind vor Allem im Test Driven Development quasi DIE Richtlinie für die Entwicklung.
    Das heißt, du definierst mit deinen Tests vorab, welche Dinge möglich sind und welche nicht.


    Deine Tests müssen alle möglichen und unmöglichen Werte abfangen - aber jeweils nur einen.


    Sagen wir, du möchtest eine Divisionsfunktion testen. div(Double a, Double b);
    Testen und in deiner Funktion korrekt abfangen musst du: a = NULL, b = NULL, a = OutOfBounds, b = OutOfBounds, b = 0
    Testen und erfolgreich dividieren lassen musst du beispielsweise: a > b, a < b, a = b.


    Dabei ist es aber völlig egal, was genau jetzt a und b sind.
    Mir ist also nicht ganz klar, warum du die Testwerte variabel gestalten willst. Mit den variablen Werten haust du dir doch nur weitere Unwägbarkeiten rein, beispielsweise, weil du ausgerechnet a = b nicht getestet hast und dir das hier um die Ohren fliegt.
    Fix verdrahtet und getippt hat das Ganze viel mehr Aussagekraft - und kann auch jede Änderung am Code zuverlässig prüfen.


    Bestimmt ist mir irgend ein Punkt zum Prüfen nicht eingefallen. Und das ist das Problem: beim Testen via UI verdaddelst du einerseits Zeit und andererseits könntest du ein Szenario stumpf vergessen. Deshalb ist automatisiert IMMER besser als manuell.

    Was war noch gleich so toll an Android? Und wo bekomme ich jetzt einen Schwung von zusätzlichen Testgeräten her?
    Naja, zwei Geräte zum Testen sollten erst einmal reichen. (Leider bekomme ich meinen Freerunner nicht mit 2.3.3 zum Laufen und mit 2.2.1 generell nicht zum Entwickeln. Das wäre doch mal die Performance-Negativ-Referenz.)


    Wie dem auch sei, das NDK scheint mir sehr zu gefallen.
    Mal schauen, ob ich das sauber eingebunden bekomme. :)
    Ich berichte.

    Prinzipiell ist die Idee mit der ArrayList sehr gut. Zumindest fahre ich den Ansatz auch immer. ^^


    Für ListViews nehme ich gern eine Subklasse des Base Adapters.
    Der ist ziemlich zügig herunter getippt und lässt sich ebenso blitzschnell an dein Datenformat anpassen.


    Eine geeignetere Struktur als eine ArrayList fällt mir gerade nicht ein, zumal so ein Index zumindest für die BaseAdapter Subklasse außerordentlich wichtig ist.

    Danke für den Tipp mit der System.nanoTime(). :)


    Leider missfällt mir das Ergebnis doch sehr...


    Eine Schleife von 10.000 Durchläufen dauert:
    iOS Simulator:
    0.08 Sekunden
    Android Emulator:
    7.64 Sekunden


    Verzehnfache ich die Durchläufe wirds noch ätzender:
    iOS Simulator:
    0.84 Sekunden
    Android Emulator:
    64.17 Sekunden


    Der einzelne Durchlauf beträgt im Schnitt:
    iOS Simulator:
    8µs
    Android Emulator:
    642µs


    Das ist um Faktor 80 langsamer. :(


    Schlimmer wird es bei einer einzelnen Berechnung.
    iOS Simulator:
    6µs
    Android Emulator:
    1366µs


    Also um mehr als Faktor 200 langsamer.


    Natürlich ist C unschlagbar fix und natürlich ist der Simulator schneller sowie der Emulator langsamer als das Endgerät.
    (Gut, bei Letzterem und meinem HTC One V bin ich mir nicht sicher.)


    Nur wüsste ich nicht, was ich optimieren kann.
    Es wird viel mit Sinus, Cosinus, Quadratwurzel und Floor gearbeitet. Also die Klassenmethoden von Math werden ordentlich getriggert.
    Weiterhin habe ich keine eigenen Structs und Zeiger, sondern muss Objekte nehmen und hin und her reichen. Dieser Overhead frisst.


    Hab jetzt mal die Geräte mit 10.000 Durchläufen getestet (zum Vergleich werf' ich die Werte aus dem Simulator/Emulator hinten ran)
    HTC One V: 1.63s (6.93s)
    Galaxy SII: 0.93s (6.89s)


    iPhone 4S: 0.65s (0.83s)
    iPod Touch 4G: 1.12s (0.84s)


    Ich werde mich mal ob des NDK schlau machen, aber so schlecht ist das ja gar nicht.
    Da hat mich wohl der Emulator ins Boxhorn gejagt.
    Danke. :)

    Du hast also ein Bibliotheks- und ein Anwendungsmodul in deinem Projekt?
    Mit genau dieser Konstellation kämpfte ich gestern auch ungefähr eine Stunde lang, bis ich den Fall aufgegeben habe.
    (Sprich: alle Klassen aus der Library in die Anwendung und gut ist.)
    Leider wird das für die Zukunft nicht hilfreich sein. -.-


    Allerdings habe ich einerseits eine andere IDE (Ich mag halt weder Eclipse noch Netbeans...) und andererseits war der Fehler sehr strange: die ZipException war der Meinung die AndroidManifest.xml sei doppelt vorhanden. Vermutlich hat sich da irgendwas mit dem Pfad behakt...
    (Hatte aber auch andere spaßige Probleme. Die via Bibliothek eingebundenen Packages konnten nicht aufgelöst werden und solche Scherze.)
    Probleme, die ich in iOS echt nie hatte. +grummel+


    Wenn also jemand ein 'bullet-proof' und 'fail-safe' Tutorial für die Erstellung eines Library und eines Anwendungsmoduls in einem Projekt hat, immer her damit.
    Gern in Bezug auf die IntelliJ IDEA 12.
    Was deren Hilfeseite behauptet, hilft nämlich leider nicht und führt zu besagter lustiger Exception.
    (Allerdings behauptet die Hilfeseite auch nicht, dass man beide Module in einem Projekt hat.)

    Moin,


    ich habe hier so ein paar Berechnungen, die gern etwas schneller gehen dürften.
    Vor Allem im Vergleich mit dem iPhone stinkt Android ganz gewaltig ab.
    (0.6ms vs 10.0ms)


    Mag sein, dass mein Versuch des Benchmarks nix taugt, da via

    Java
    new Timestamp(new Date().getTime());


    ja immer ordentlich Bewegung auf der VM ist. Nichts desto trotz ist es gefühlt sehr langsam - das will ich so nicht.


    Hat jemand einen Tipp oder ein Tutorial, aus dem hervor geht, wie man schnelle C-Funktionen in eine Android-App bekommt?
    Da das zu Grunde liegende System außerhalb der VM ja ein Linux ist, muss es auch eine C-Unterstützung geben.
    Ich würde die gern nutzen, da die Berechnungen unter allesamt mit Zeigern, Strukturen und primitiven Datentypen durchgeführt werden.
    In Android habe ich das Problem, dass alles ein Objekt ist. Das kostet ungemein Zeit.


    Bin für jeden Tipp dankbar. :)

    Moin.

    Ich wollte in meine Android-App ein paar Soundtracks aus Filmen implementieren und wollte fragen, ob jemand eine Idee hätte, wie ich das ohne Copyright-Probleme hinbekommen kann.


    Indem du dir von den Rechteinhabern die Nutzung genehmigen lässt.
    Alles Andere bringt dir im Falle einer Abmahnung überhaupt nichts.

    Manchmal frage ich mich, ob Menschen die Logausgaben überhaupt lesen bevor sie sie irgendwo einstellen...


    Zitat

    E/AndroidRuntime(10902): android.content.res.Resources$NotFoundException: String resource ID #0x0


    Was auch immer du setText() für einen Parameter übergibst (Vermutlich ein R.string.text), er existiert nicht.
    Du hast ihn vermutlich vergessen in der strings.xml einzutragen.


    Und dein Handler-Ansatz muss eigentlich funktionieren.
    Das Problem ist, dass du songDuration.setText() außerhalb des Handlers aufrufst und dir damit alles um die Ohren fliegt.
    Du bist in der Runnable und willst auf ein View des Main Threads zugreifen. Das geht nicht und genau das erzählt dir auch das Log.


    Richtig wäre dein gewählter Ansatz schon gewesen:


    (Ich persönlich nenne meinen Handler stumpf 'uiThreadHandler', damit mir immer klar ist, dass das Ding auf den UIThread zugreift.)

    Ich verstehe deine Frage nicht.
    getIntent() ist meines Wissens immer null, wenn du kein aufrufendes Intent hast.
    getData() ist null, wenn das aufrufende Intent keine Daten hat.
    Manche Intents arbeiten mit getExtra(), das muss dann aber dokumentiert sein.


    Nur: wenn dein getIntent() immer null ist liegt das daran, dass kein aufrufendes Intent existiert. Warum dem so ist kann ich dir auch nicht sagen.
    Wenn aber Galerie und Kamera Intents wunderbar funktionieren, liegt das wohl an der anderen App.

    Ja ja, die Studiengemeinschaft Darmstadt. :)


    All das kann ich so unterschreiben, war damals™ bei meinem Studiengang 'C/C++ Entwicklung unter Linux' genauso.
    Leider war der Mentor ein bisschen eigen, er bestand auf sein RedHat Linux als Entwicklungsumgebung. Allerdings lief auf meinem Laptop ein selbst zusammengestecktes Gentoo, da es für RedHat 9 eher ungeeignet war. (X Window Server zerschoss die anderen TTY, Performance war im Keller, keiner der Netzwerktreiber funktionierte...)


    Da war der gute Mann ein bisschen unflexibel und schob alle Ausführungsprobleme auf mein System.
    Auch nett fand ich, dass damals™ die Beispieldaten noch auf 3 1/2" Diskette ausgeliefert wurden (damals™ ist übrigens Mitte 2006!) - aber weder in meinem Haushalt noch im gesamten Bekanntenkreis jemand die Hardware zum Auslesen besaß.
    (In die 5 1/4" Floppy des C64 passten die irgendwie nicht. ^^)


    Aber ich muss wirklich sagen das es mich wirklich weiter gebracht hat auch um viele Hintergrundinformationen zu erhalten.


    Das kann ich so für meinen Lehrgang leider nicht unterschreiben... -.-
    Ich hatte bereits in der Berufsschule so ein wenig Vorbildung im Bereich der Softwareentwicklung, weshalb mir gefühlt 80% der Konzepte klar waren und ich hatte auch schon ein paar Lehrgänge an einer VHS zum Thema besucht. Deshalb gab es da kein AHA-Erlebnis.


    Derzeit basteln wir gerade ein Projekt zusammen zur Geodatenerfassung.


    Geodatenerfassung finde ich persönlich recht spannend, allerdings ist Genauigkeit nicht unbedingt die Stärke von GPS. +sigh+


    Also ich muss wirklich sagen das ich zwar mit meiner Methode "Learning by doing" auch schon einiges erreicht habe aber mit dem Studium wirklich viele Hintergrundinfos erhalte und gelerntes vertieft wird.


    Das war bei mir halt grundlegend anders. Hinzu kam, dass mich das allein lernen neben dem Beruf alles Andere als motivierte.
    Ich fühle mich in speziellen Trainings mit kleinen Gruppen oder VHS-Kursen wesentlich besser aufgehoben. Das mag Geschmackssache sein, ich wollte es aber erwähnt wissen. :)


    Vermutlich ist das Hilfreiche der Zwang dahinter in Verbindung mit den zusammengestellten Aufgaben. Du bekommst eine lösbare Aufgabenstellung, die deinem Können oder dem vermittelten Wissen entspricht. Das vereinfacht das gezielte Lernen ungemein.
    Im 'Learning-By-Doing' hast du das Problem nicht zu wissen, wo du beginnen sollst. Du musst also das Wissen entsprechend deiner Zielstellung zusammensuchen, gehst den Weg also in die andere Richtung. Das haben wir so nicht gelernt, da uns aus unserer Schul- und ggf. Studienzeit etwas Anderes bekannt ist: Wissen aufsammeln und abrufen.
    Eigentlich können wir nur so lernen. Wenn wir uns also eine Zielstellung setzen, müssen wir dann ermitteln, welches Wissen diese Zielstellung erfordert.
    Das sollten wir dann in erlernbare Elemente aufteilen, erlernen und vertiefen. Irgendwann haben wir dann die Zielstellung erreicht und uns quasi nebenbei Wissen angeeignet.


    So lerne ich für mich allein wesentlich günstiger und ähnlich effektiv wie über ein (Fern)Studium oder einen (Fern)Lernkurs.


    Ich mache beruflich auch was völlig anderes und es ist bei mir leider auch immer noch beim Hobby geblieben. Ich habe mir dadurch aber schon eine App für meine Außendiensttätigkeit programmiert.


    Das kenne ich. Irgendwann kann sich so etwas aber schnell ändern. ^^

    Deshalb hasse ich Exception Handling. ^^


    Kann es sein, dass deine Activity aus welchen Gründen auch immer nicht ordnungsgemäß das MediaMetadataRetriever Datasource Interface implementiert?
    Immerhin wirft dir das Setzen der DataSource die erste Exception: IllegalArgumentException

    Heiho!


    2) Keine Ahnung.


    1) Soweit ich mich entsinne ist der Druck auf die Zurücktaste von Hause aus mit einem finish(); der Activity verknüpft.
    Das heißt, die aktuelle Activity wird geschlossen und die zuletzt offene Activity wird wieder angezeigt.
    Betrachte es als eine Art Stack. Mit jedem startIntent() wird eine Activity auf den Stapel geschmissen, mit jedem finish() wieder runtergenommen.
    [0]MainActivity
    [1]SettingsActivity
    [2]InfoActivity
    [3]ShareActivity
    [4]InfoActivity
    [5]ShareActivity
    [6]SettingsActivity
    [7]currentActivity


    Du könntest das optimieren, in dem du beim Aufruf der Folgeactivity die eigene Activity beendest.
    Also deine 'Hauptactivity' ruft nur die Subs auf, jede Sub ruft erst eine Sub auf und macht dann ein finish().
    [0]MainActivity
    [1]currentActivity

    Naja, das mit dem Datum vergleichen hatte ich so auch schon. Nur klappt das leider auch nur wenn man die App regelmäßig startet.


    Ausgezeichneter Punkt.
    In dem Fall merk dir doch einfach, wann die App das letzte mal gestartet wurde und schaue nach, ob die 15 zwischen dem letzten und dem aktuellen Datum liegt.
    Ob du da jetzt noch Jahr und Monat in die Unterscheidung rein bringen solltest weiß ich allerdings nicht.

    Ich würde jetzt ganz simpel einfach das Datum vergleichen...
    Also aktuelles Datum holen, eingetragenes Datum holen, schauen ob DAY_OF_MONTH passt und gut.
    Für Quartalszahlungen musst du dann natürlich noch den Monat berücksichtigen.
    Und wenn du es ganz schlau machen willst, prüfst du mit DAY_OF_WEEK noch, ob das Datum/Heute vielleicht an einem Wochenende liegt und verschiebst es entsprechend.


    Obacht: Während DAY_OF_MONTH bei 1 beginnt, beginnt MONTH selbst bei Calendar.JANUARY, also 0...


    Ich persönlich wäre allerdings dagegen, dass eine Anwendung einfach irgendwo irgendwas einträgt.
    Lieber wäre es mir, die App sagt mir 'Hey, heute ist der 15. Gemäß deiner Angaben stehen heute folgende Buchungen an. Welche davon soll ich durchführen?
    [√] Fitnessstudio
    [√] Studiengebühren
    [√] Monatskarte"


    Aber das ist wie gesagt nur mein persönlicher Geschmack. :)

    Ich habe von dem Thema 'PhoneGap' zwar keine Ahnung, aber immerhin einen Link.


    Zusammengefasst sind PhoneGap Anwendungen also wesentlich langsamer als native Apps (und je nach Betriebssystem im WebView sogar langsamer als im ordentlichen Browser), für komplexe Berechnungen ungeeignet und unterstützen kein Threading.


    Da ich die meisten meiner Tests auf einem HTC One V mache (echt nicht das schnellste Rennpferd im Stall), sind das alles Kriterien, die für mich ganz klar gegen eine Verwendung von PhoneGap oder ähnlichen Frameworks sprechen.