Beiträge von Marco Feltmann

    Wie sollten sie das machen?
    Das Betriebssystem kann niemals wissen, welche Aufgaben deines Programms wofür da sind und dementsprechend auch nicht eingreifen.
    Die Framerate hängt immer von dem implementierten Programm ab und es ist auch einzig die Aufgabe dieses Programms, die Framerate gegebenenfalls zu regulieren.

    Also 'bei mir geht es nicht' ist immer eine unzureichende Beschreibung. ;)


    Deine Worte verwirren mich.
    Du bekommst du eine NullPointerException, wenn explizit der Zweig der If-Abfrage angesprungen wird, in dem 'row' niemals nicht null sein kann?
    Das kann nicht sein. Darf es zumindest nicht. Diese Art des ViewHolderPatterns habe ich schon so unendlich oft erfolgreich benutzt...

    Wenn dir Items fehlen, dann musst du natürlich auch die Anzahl in getCount() entsprechend erhöhen.

    Java
    int count = array.length;
    // Hier nutzen wir die Eigenheit, dass die Division durch einen int einen int zurückliefert.
    int bannerCount = count / 4;
    return count + bannerCount;


    So, nun zu deinen Abstürzen.
    Vermutlich hast du Obiges bereits bedacht, dann ist allerdings dein Code bezüglich der Abfrage der Items falsch.
    Es sollte zumindest eine OutOfBound Exception geschmissen werden. ;)


    Nehmen wir mal Position 19.
    Wir haben an Position 19 deines ListViews bereits 5 Werbebanner, nämlich für die Positionen 0, 4, 8, 12 und 16.
    Deine Position ist also locker um fünf Indices zu weit hinten. Während du sagst array[19] willst du eigentlich array[14]. Du kannst dir die Sache ja mal aufmalen. ;)


    Insofern wirst du die Indizes in Abhängigkeit der aktuellen Position ändern müssen.


    Anbei ein kleines Beispielprojekt, ganz simpel mit 'javac Rechnen.java' compilieren und mit 'java Rechnen' starten.


    Ich denke, ich sollte alle Problemfälle abgefangen haben, die sich bei diesen doch sehr begrenzten Eingabemöglichkeiten bieten. ^^


    (Nein, mir ist keine superdupertolle mathematische Formel eingefallen, mit der man ausrechnen kann, wie viele Elemente angezeigt werden müssen.
    Vielleicht via numberOfRuns+Math.ceil(numberOfRuns/(bannerPosition-1)) oder so. +schulter zuck+)

    Nach mehreren Stunden der Verzweiflung, in denen mir die Runtime permanent meine OnItemClickListener unter dem Arsch weg gerissen und durch was Eigenes ersetzt hat, hier der ultimative Tipp zur Lösung:


    Setzt den Listener nicht in der onCreateView Methode!


    Führt zu folgender phänomenaler Ausgabe unglaublicher Verwirrung:


    Ich habe nicht den Hauch einer Ahnung wer was wie wann warum wozu wo austauscht, Fakt ist aber, dass der Tab auf ein Listenelement ohne Resonanz bleibt.


    Tja, ich war einfach zu früh dran.


    Works like a charm...
    Und in der onStart() funktioniert auch getListView() wieder vernünftig.
    Die onViewCreate war einfach zu früh für diese Aktionen. Nur unfreundlicherweise hat sie mir das natürlich verschwiegen!

    Irgendwie kenne ich nur Tutorials für Mac OS X und Objective-C.
    Könnte daran liegen, dass ich das länger mache. ;)


    Jedenfalls kannst du dir da gegebenenfalls was abschauen:
    Space Invaders
    Worm-X


    Beide Tutorials sprechen meiner Erinnerung nach das Thema FPS-Bremse an.


    Und ebenfalls für den Mac ist mir ein (mittlerweile) kostenloses eBook bekannt:
    Pangea Software's Ultimate Game Programming Guide for Mac OS X


    (Ich hab noch die gedruckte Fassung im Regal stehen...)


    Hilft dir vermutlich nur bedingt, da die ganzen Dinge auf OpenGL und C/Objective-C basieren, doch vielleicht kannst du da ja das ein oder andere adaptieren. :)

    Oder


    Java
    int[] deinArray = { 5,5,5,5,5,5,5,5 };
    
    
    for (int intVariable : deinArray) {
    intVariable = intVariable * 5;
    }


    Dieser Code ändert jedoch nicht die Integer im Array. Das wäre vielleicht noch wichtig zu sagen.


    Schade, dass Java keine Zeiger auf Zeiger unterstützt, sonst hätte ich jetzt mit meinem C-Wissen angeben können...

    C
    int len = deinArray.length;
    int[] ergebnisArray = new int[len];
    
    
    while ( len-- ) {
        *ergebnisArray++ = *deinArray++ * 5;
    }

    Was steht denn in der MainActivity in Zeile 231?


    Zitat

    04-23 17:45:14.863: E/AndroidRuntime(11116): at com.example.testproject.MainActivity$CreateSongList.onPostExecute(MainActivity.java:231)


    Um die Performance und den Speicherverbrauch der Listen würde ich mir Sorgen machen, wenn du damit Probleme bekommst. Da jede Liste ja nur eine Referenz auf ein Objekt hält sind die nicht so unglaublich groß wie man annehmen könnte.

    kann man doch überall installieren.
    http://www.jetbrains.com/idea/download/index.html
    oder täusche ich mich da?


    Du hast natürlich völlig recht. :)



    Nun ja, wichtig ist erst mal folgende Zeile:

    Zitat

    04-20 15:11:40.481: E/AndroidRuntime(409): Caused by: java.lang.NullPointerException


    Das heißt, dass irgend ein Objekt, an das du eine Nachricht schicken möchtest, null ist.


    In Verbindung mit

    Zitat

    04-20 15:11:40.461: W/System.err(409): org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 2: not well-formed (invalid token)


    schließe ich aus den Aussagen, dass du versuchst asynchron ein XML zu bearbeiten. Da dieses nicht valide ist, sind auch die zu verarbeitenden Daten null und jeder Zugriff darauf schlägt fehl.


    Man kann sich jetzt darüber streiten, ob der Code falsch ist (der sollte das abfangen) oder dein XML (das sollte valide sein).
    Abschließend kann man dank dieser Zeile

    Zitat

    04-20 15:11:40.481: W/System.err(409): at de.appmagine.saisonkalender.App$LoadMonthTextsTask.doInBackground(App.java:126)


    davon ausgehen, dass das Problem an Zeile 126 in App.java steckt.
    Vermutlich rufst du dort PListXMLParser.parse(param) auf und entweder ist der PListXMLParser oder param == null.

    Die Frage ist tatsächlich, wie genau dieses Benutzerwort/Passwort implementiert ist.
    Als Login Maske einer Seite kannst du den von killphil75 vorgeschlagenen Weg nutzen.
    Wenn es sich aber um eine Login-Seite des HTTP Servers handelt wird das ganze sicherlich etwas komplizierter.
    Du müsstest dann irgendwie den Nutzernamen in die URL pappen und die Kennwortabfrage abhandeln. Wie genau das funktioniert weiß ich allerdings auch nicht.

    Du hast in der doInBackground() keinen Zugriff auf deinen UI Thread.
    Der WebView kann meines Wissens wie jedes andere View auch nur auf dem UI Thread laufen.


    Auf den UI Thread können nur onPreExecute(), onPostExecute() und onProgressUpdate() zugreifen.
    (Allerdings nur dann, wenn dein AsyncTask Teil deiner Activity ist.)


    Davon abgesehen macht deine doInBackground() ja permanent irgendwas. Woher willst du da mitten drin wissen, ob er jetzt fertig ist oder nicht?
    Generell: mach nix mit der UI in der doInBackground(). Gar nix. Nie.
    Mach alles, was du mit den im Hintergrund wie auch immer manipulierten Daten machen möchtest, in der onPostExecute().
    Erst da ist gewährleistet, dass wirklich alle Daten korrekt und erfolgreich bis zum Ende manipuliert wurden. Und dort hast du dann auch wieder Zugriff auf deinen UI Thread.


    Jetzt könntest du anmerken, dass es ja eine Möglichkeit geben muss um beispielsweise den aktuellen Downloadstand mitzuteilen. Da rufst du in der doInBackground() die publishProgress() auf und machst die UI Modifikationen in der onProgressUpdate(). Du machst ausschließlich UI-unabhängiges in der doInBackground()!

    Wenn niemand jemals GPS gestartet hat, dann gibt es auch keine getLastKnownLocation(). Woher sollte der LocationManager sie auch kennen, wenn er nie eine Location abgerufen hat?
    Sobald du dich via requestLocationUpdates() rein hängst, wird GPS gestartet und du bekommst eine getLastKnownLocation() zusätzlich zu den neuen Updates.


    Ich denke mal, das soll Performancegründe haben. Wenn deine App mit GPS schlafen geht, du sie aufweckst und sich GPS erst langwierig wieder verbinden will, kannst du immerhin auf eine zuletzt bekannte Location zurückgreifen, um nicht völlig ohne Daten da zu stehen.