Beiträge von Marco Feltmann

    Wobei gesagt sei, dass nicht zwangsweise alle Tablets auch mind. Android 3 besitzen. Mein erstes Tablet hatte auch nur 2.x .


    Das mag natürlich stimmen. Doch die ersten Tablets, die für 3.0 konzipiert waren, hatten schon die anderen Buttons.
    Bei den Phones ging das erst mit der Konzeption für 4.0 los.


    >> Du kannst dafür einfach den 'kürzliche Apps' Button länger gedrückt halten. ;)
    ich danke dir, funtioniert aber leider nicht :(


    Definiere 'funktioniert aber leider nicht'.
    Fang mal den KeyPress für 'Menü Button' ab. Das funktioniert.


    Wenn dein Menü nicht gezeigt wird kann das andere Ursachen haben.
    Beispielsweise die, dass das Menü komplett in der Action Bar angezeigt wird und es deshalb überhaupt keinen Grund dafür gibt, auf den Druck des Menü Knopfes zu reagieren.
    (Diese Funktionalität ist meines Wissens nur zur Abwärtskompatibilität mit Software für 2.x gedacht.)

    Ich habs zwar nicht probiert, aber wenn du AsyncTask<Url, Long, Long> definierst, sollte ein execute(urlArray) dir auch die Parameter als Array liefern, so wie du sie auch schon verarbeitest, aber eben nicht Listen, sondern nur Url... als Paramter.


    Ahaa.

    Java
    URL[] urls = new URL[urlArray.size()];
    new Downloader().execute(urlArray.toArray(urls));


    So läuft es auch ohne seltsame Warnungen. :)
    Ich muss nur mal schauen, ob ich jetzt nicht doch zufällig zu viele OnPostExecutes bekomme...
    Nö, bekomme ich nicht. Na, damit kann man doch arbeiten. :)


    Danke!

    Handy: für Android 2 konzipiert
    Tablet: für Android 3 konzipiert


    Die Hardware für Android 3 und aufwärts hat keinen Menü-Button mehr.


    Du kannst dafür einfach den 'kürzliche Apps' Button länger gedrückt halten. ;)

    +hm+
    Also ist mein Vorhaben nicht trivial?


    Gut, dann gebe ich einfach den Handler des UI Thread mit und gut ist.
    Der bekommt dann die Erstellung der Dialoge aufgedrückt.


    Wegen der Vermeidung schaue ich mal. Da ich es irgendwie eh nicht schaffe, aus einem Array eine Parameterliste zu basteln, werden es trotz mehrere Downloads offenbar dennoch nicht mehrere postExecutes werden.


    Eigenartig, dass dieses Thema so komplex anmutet.

    Hi Uwe,


    freut mich zu lesen, dass ich nicht der Einzige mit Verständnisproblemen bin. :)


    In der postExecute() mache ich aktuell:

    Java
    @Override
    // Also executed on the UI Thread, they said.
    protected void onPostExecute(Long result)
    {
        Log.e(TAG, "Download completed with result "+result);
    }


    Gezeigter Codeschnippsel ist der Bereich, der mir die erste Exception wirft: ich habe also in meiner anonymen Inner-Class keinen Zugriff mehr auf meinen UI Thread, was das Ganze extrem erschwert.
    Der ganze Threading Kram wird erst bei daConnector.loadDataUpdatesForTypes(types); angeschmissen, und zwar in der Connector Klasse.


    Das Ganze ist noch Testcode, weshalb es kein ordentliches Exceptionhandling gibt.


    Meine Idee war ein eigener Download-Manager, der einfach unabhängig von wo auch immer aufgerufen ein paar entsprechende Dialoge darstellt.
    Die Trennung der Logik (also Download über mehrere Threads) von der Darstellung (Download-Dialog beispielsweise mit Fortschrittsanzeige) und anschließendes Zusammengeleime fällt mir hier arg schwer.


    Nur nützt es rein gar nichts, irgendwelchen im Android SDK nicht existenten Lösungen herzutrauern. Es muss sich irgendwie umsetzen lassen. Meine Frage ist nur: wie.


    Den UI Handler möchte ich halt ungern immer mitschleppen und alles darauf auslagern. Aber offenbar muss ich das tun.

    Moin,


    ich muss mal wieder nerven. ;)


    Also ich verstehe das Konzept der Asynchronen Tasks wie folgt:
    - Es gibt Dinge, die auf dem UI Thread durchgeführt werden. Namentlich onPreExecute, onPostExecute und onProgressUpdate.
    - Es gibt Dinge, die in einem anderen Thread durchgeführt werden. Namentlich doInBackground.


    Das ist zumindest das, was mir die Dokumentation erzählen möchte.


    Jetzt stelle ich fest, dass dem eben nicht so ist. onPreExecute, onPostExecute und onProgressUpdate werden auf dem Thread ausgeführt, auf dem die Java-Klasse läuft. Dies muss nicht zwangsläufig der UI Thread sein und ist es in meinem Fall auch überhaupt nicht - irgendwie.


    Also Folgendes: ich habe eine Klasse, die im Hintergrund ein paar Daten herunterladen soll.
    Der Hintergrunddatenherunterladevorgang wird in einem asynchronen Task dieser Klasse durchgeführt.
    Die onPreExecute, onPostExecute und onProgressUpdate haben keinen korrekten Zugriff auf den UI Thread.

    Zitat

    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()


    Nun wollte ich erstmal ein paar Arbeiten vorverlegen. Ich habe mir eine Art Notification Center erstellt (wenn es dafür etwas Fertiges gibt, immer her mit der Info).
    Nicht das Ding im OS, welches irgendwelche Informationen ausspuckt. Eher eine Art Beobachter/eigener Listener für alles Mögliche.


    Nun stelle ich leicht genervt fest:


    Tja, was soll ich sagen...

    Zitat

    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()


    Meine 'anonymous inner class' von NotificationCallback() ist also auch irgendwo, nur nicht auf dem UI Thread.


    Weiter unten in der Dokumentation finde ich noch den Hinweis, dass AsyncTask doch bitte nur über den UI Thread aufzurufen sei. Also sämtliche Überlegungen umsonst.


    Wie bekomme ich denn jetzt den Download in einem anderen Thread durchgeführt und die Daten wie 'Aktuell heruntergeladen' und 'Gesamt' an den UI Thread überführt, wenn der Download etc.pp. von einer eigenen Klasse aus durchgeführt werden soll?

    Ich hab ne PS3 und werde die 4te Generation wohl überspringen.
    ...
    Mal sehen was dann die 5er bringt xD


    Ich glaube, ich mach's mit Zweierpotenzen.
    PlayStation 1: Check
    PlayStation 2: Check
    PlayStation 3: [nope]
    PlayStation 4: Check


    Das heißt, ich habe dann bis zur PS 8 Zeit. ^^


    P.S.: Ich finde das Aussehen schon wichtig. Immerhin steht sie im Wohnzimmer und da sollte das schon passen und nicht ein hässlicher Klotz sein...


    Die steht dann neben meiner pinken Wii, dem grauen Plattenspieler mit Acrylglasdeckel, unterhalb des silbernen Mac Minis als Media-PC, unterhalb des schwarzen Sony Fernsehers direkt über der schwarzen Panasonic Anlage von 1998 mit Pioneer Radio und Sony Kasettendeck...
    Mir ist Optik ja sowas von egal. ^^

    Hui, sieht spaßig aus.
    Setz' mal den EditType deines EditText zu text oder 'textNoSuggestions', wenn es immer noch auftritt.


    Also

    XML
    <EditText
        	android:id="@+id/editText1"
        	android:layout_width="match_parent"
        	android:layout_height="wrap_content"
            android:inputType="textNoSuggestions" >
        	        <requestFocus />
    	</EditText>

    Schwer zu sagen. Aber die Präsentation fand ich großartig.
    Blick aufs Wesentliche: Controller und Spielgefühl. Den Kasten schaut doch eh keiner an.
    Zusätzlich noch ein bisschen Geheimniskrämerei und sowohl den Medien als auch der Konkurrenz keinen Einblick gewähren.
    Saugeil. :)
    Da ich die PS3 übersprungen habe ist es mir eigentlich wurscht wie gut die PS4 wird. Die wird so oder so gekauft. ;)

    Dazu muss man sagen, dass das nur den eigenen Listener abmeldet. Hat man mehrere eigene Listener, muss man sie alle abmelden. Hängt aber noch eine andere App auf dem locationManager, dann wird GPS schön weiter gefeuert und frisst weiterhin Strom - da kann man halt nix gegen machen.


    Generell gilt: wenn ich an ein Objekt ein add*Bla* sende, dann muss ich das auch wieder via remove*Bla* entfernen.
    In 80% der Fälle übernimmt das GC für mich, aber in den restlichen 20% muss ich das dennoch manuell machen.

    Nö, gibt kein Insert.
    Ja, es gibt eine bessere Möglichkeit.


    Wenn du die Liste aber als Array Liste definierst (oder castest), dann bekommst du eine überladene Add-Methode:
    add(int, String)


    Die tut genau das, was du brauchst. :)

    Das wird dir nix bringen, die UrlConnection öffnet sich, holt die Daten und schließt sich wieder. Unabhängig von der Dauer des Vorgangs.
    Erst dann beginnt das Parsen.


    Du musst nach dem Setzen der Breakpoints auch den Debugger anhängen. Wie das in Eclipse geht weiß ich nicht, aber in IntelliJ gibt es einen netten grünen Käfer neben dem Run-Symbol. Dann werden die Breakpoints auch angesprungen.


    Ich stecke gerade voll im Stress und habe deshalb auch keine Zeit, dir da noch einmal so ausschweifend zu helfen.
    Aber du musst das ja auch irgendwann mal selbst können. ;)

    +hm+

    Zitat

    02-19 17:16:07.355: E/AndroidRuntime(14446): Caused by: android.os.NetworkOnMainThreadException


    Kann es sein, dass dein Device/AVD nicht auf 2.3.3 sondern was Neuerem läuft?
    Falls ja, dann musst du die Netzwerksachen auf einen anderen Thread auslagern.
    Steht doch da. ;)

    Genau deshalb hasse ich die Art und Weise, mit der Try-Catch-Blöcke implementiert werden... +seufz+


    Fakt ist: irgendwas geht schief.
    (Die URL sieht jedenfalls ganz gut aus.)


    Problem ist: du weißt nicht was schief geht.


    Besser:


    Zitat

    02-19 16:04:58.436: ERROR/ReadXML(683): IO - is open.mapquestapi.com
    02-19 16:04:58.436: ERROR/ReadXML(683): Problem: InputStream == null. Aborting


    IOException beim Versuch, den InputStream zu erzeugen.
    Doku sagt:
    "Equivalent to openConnection().getInputStream(types)."
    Dann versuchen wir das mal.



    (Zum Glück sagt mir meine IDE, welche nicht abgefangenen Exceptions sie so erwartet - da muss ich dann nicht so lange rumsuchen...)

    Zitat

    02-19 16:14:28.416: ERROR/ReadXML(814): IO - getInputStream open.mapquestapi.com
    02-19 16:14:28.416: ERROR/ReadXML(814): Problem: Stream == null. Aborting


    Tja, und nun?
    Machen wir aus dem e.getMessage() ein e.toString():

    Zitat

    02-19 16:20:30.796: ERROR/ReadXML(948): IO - getInputStream java.net.UnknownHostException: open.mapquestapi.com
    02-19 16:20:30.796: ERROR/ReadXML(948): Problem: Stream == null. Aborting


    Aha. Host open.mapquestapi.com unbekannt.
    Die Berechtigungen für Internet sind aber gesetzt.


    Emulator neu gestartet, nachdem ich mich vergewissert habe, dass das Internet dort korrekt läuft:
    Keine Besserung.


    open.mapquestapi.com gegen 205.188.201.176 getauscht:

    Zitat

    02-19 16:29:53.585: ERROR/ReadXML(369): IO - getInputStream java.net.SocketException: Permission denied
    02-19 16:29:53.585: ERROR/ReadXML(369): Problem: Stream == null. Aborting


    Och mennoooo, falsche AndroidManifest.xml angepasst... +knurr+

    Zitat

    02-19 16:33:04.236: ERROR/ReadXML(433): Info: residential


    Aha.


    Dann wieder zurück von IP auf Hostnamen:

    Zitat

    02-19 16:33:52.825: ERROR/ReadXML(466): Info: residential


    Jau, läuft.
    (Das war dann mal ein Crash-Kurs im Debugging. Wobei 'crash' in Verbindung mit '30 Minuten' echt geprahlt ist... :P)