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.
Beiträge von Marco Feltmann
-
-
Warum sollten sie gedrosselt sein? Wie sollte man so etwas drosseln?
-
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.
Javaint 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.
Java
Alles anzeigenimport java.lang.Integer; import java.lang.Exception; public class Rechnen { public static void main(String[] args) { // Standardwert für die Werbepositionierung setzen, hier: jede vierte Zeile int bannerPosition = 4; // Eingabe lesen und in eine Zahl wandeln sofern möglich. try { bannerPosition = Integer.parseInt(args[0]); } // Wenn was schief geht darauf hinweisen und den Standardwert nutzen. catch(Exception e) { System.out.println("Parameter 1 konnte nicht gelesen werden, arbeite mit "+bannerPosition+" Zeilen."); } // Um Endlosschleifen zu vermeiden sollte die Bannerposition größer 1 sein. if(bannerPosition <= 1) { bannerPosition = 2; } // Standardwert für die Durchläufe setzen, hier: 50 // (Gleichbedeutend für die eigentliche Anzahl der Elemente beispielsweise in einem Array) int numberOfRuns = 50; // Wieder die Eingabe lesen und sofern möglich in eine Zahl umwandeln try { numberOfRuns = Integer.parseInt(args[1]); } // Beziehungsweise Info geben und Standardwert nutzen, wenn es nicht möglich war. catch(Exception e) { System.out.println("Parameter 2 konnte nicht gelesen werden, arbeite mit "+numberOfRuns+" Durchläufen."); } // Anzahl der gezeigten Banner speichern. int bannerAmount = 0; // Und alle Elemente durcharbeiten. for(int position = 0; position < (numberOfRuns+bannerAmount); position++) { // Wir zeigen einen Banner if(position % bannerPosition == 0) { // und erhöhen die Anzahl der gezeigten Banner und erhöhen damit auch die Anzahl der Schleifendurchläufe bannerAmount++; System.out.println(position+"\t| WERBEEINBLENDUNG |"); } // Wir zeigen einen Eintrag. else { // Natürlich müssen wir schauen, dass wir die richtigen Indices unabhängig der Position zeigen. int numberOfBanners = (position / bannerPosition)+1; System.out.println(position+"\t: "+(position-numberOfBanners)); } } // Ende Gelände, Aus die Maus, hier kommt nix mehr. } }
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!
Java
Alles anzeigenpublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View createdView = inflater.inflate(R.layout.event_list_fragment, container, false); superView = createdView; collectedEventsAdapter = new EventAdapter(inflater.getContext()); // Setting up the data setListAdapter(collectedEventsAdapter); resultListView = (ListView)createdView.findViewById(android.R.id.list); Log.e(TAG, "Created view "+createdView); // This one will fail! resultListView.setOnItemClickListener(this); return createdView; }
Führt zu folgender phänomenaler Ausgabe unglaublicher Verwirrung:
Zitat05-18 13:04:25.197: ERROR/OwnListFragment(1390): Attached to activity info.lucasdevil.OwnActivity@405900e0
05-18 13:04:25.207: ERROR/OwnListFragment(1390): Created with bundle null
05-18 13:04:25.839: ERROR/OwnListFragment(1390): Listener set: info.lucasdevil.fragments.OwnListFragment$1@40642028
05-18 13:04:25.839: ERROR/OwnListFragment(1390): Created view android.widget.LinearLayout@406074c8
05-18 13:04:25.839: ERROR/OwnListFragment(1390): Acitivty Created with Bundle null
05-18 13:04:25.839: ERROR/OwnListFragment(1390): View State Restored with Bundle null
05-18 13:04:25.839: ERROR/OwnListFragment(1390): On Start
05-18 13:04:25.839: ERROR/OwnListFragment(1390): getListView().getOnItemClickListener(): android.support.v4.app.ListFragment$2@4054df60Ich 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.
Java
Alles anzeigen@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View createdView = inflater.inflate(R.layout.event_list_fragment, container, false); superView = createdView; collectedEventsAdapter = new EventAdapter(inflater.getContext()); // Setting up the data setListAdapter(collectedEventsAdapter); resultListView = (ListView)createdView.findViewById(android.R.id.list); Log.e(TAG, "Created view "+createdView); return createdView; } @Override public void onStart() { super.onStart(); resultListView.setOnItemClickListener(this); }
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-XBeide 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.
-
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...
-
Was steht denn in der MainActivity in Zeile 231?
Zitat04-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.
-
habe das jetzt so gemacht und funzt eigentlich (bis jetzt )
Büschen mehr Optimismus, bitte. -
Beim ersten Überfliegen: sollte dein MediaPlayer existieren ohne aktuell zu spielen werden die locationUpdatesListener nicht entfernt.
Ansonsten: ist dein lm eventuell null?
-
Mag sein. Dann aber sicherlich mit einem anderen zu parsendem PList als du es verwendest...
-
Unter iOS konnte man einfach das Rect setzen, welches die Anzeige auf der Karte regelt.
Ich glaube, dass die Maps API eine ähnliche Funktionalität bietet.Ha, gefunden!
https://developers.google.com/…/views#setting_boundaries -
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:
Zitat04-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
Zitat04-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 ZeileZitat04-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. -
Nun, wenn du IntelliJ auf dem Windows Rechner zum Laufen bekommst gratuliere ich recht herzlich und frage dich, wie du das geschafft hast.
(Mac only) -
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()!
-
Noch ein Einfall: viele Mac-User (so wie ich) mögen Eclipse ganz und gar nicht und deshalb nutzen sie IntelliJ Idea.
Da wirst du mit einem einfachen Öffnen der Daten in Eclipse natürlich nichts. -
Welche LogCat Ausgaben hast du bei den Abstürzen?
-
Keine Erfahrungen damit gemacht.
-
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.