Beiträge von antifish

    Ja, bei dauerhafter Verbindung ist der AsyncTask aber nicht zu empfehlen!


    Genau, separate Klasse mit einem Endlos Loop der deine Kommunikation macht, dazu ein paar Callbacks für deine Acitvity das neue Daten parat sind.
    Dort dann einfach darauf schauen, dass wenn du UI Elemente aktualisiert, dies unbedignt auf dem MainThread tun musst.
    Da mir gerade ein bisschen langweilig war habe ich dir ein kleines Demo Project gemacht.
    Das liest alle 5 Sekunden die aktuelle Uhrzeit von einer Webseite und senden sie an deine MainActivity, dort wird auf dem UI Thread die View aktualisiert.
    Der Code ist extra simpel gehalten, keine saubere Exception auswertung, das warten ist hässlich gelöst, der Client sollte noch disposed werden etc, aber je weniger code desto einfacher zu verstehen. Einfach fragen wenn etwas nicht klar ist.


    Zip File ist hier:
    http://nibdev.com/NetTimeDemo.zip

    Hi Snipor,


    deine Fragen 1 & 2 laufen eignetlich aufs selbe hin:
    Wenn du deine ipcon / socket etc variablen nur im "doinbackground" hälts und keine refernez in deiner klasse die den async task aufruft hälst, oder sonst wo, dann kannst du ausserhalb des async task sowieso nicht mehr darauf zugreifen, der garbage collector wird die nach belieben verwerfen.
    Wenn du die variablen aber in deiner klasse definiert hast, und nicht nur im "doinbackground", dann sind sie auch nacher noch vorhanden. die methoden werden aber immer in dem thread ausgführt, von dem du sie aufrufst. instanziert du deine tcp/ip sachen also im "doinbackground" gibts keinen fehler, führst du dann aber im mainthread eine funktion darauf aus, wirds wohl eine "networkonmainthread" exception geben.
    Gut, dass nützt dir nichts :)


    Ich denke eher es ist eine konzeptionelle frage. Was willst du genau anstellen?
    Willst du etwas einmalig tun, zB ein Bild herunterladen oder eine http get / post anwort erhalten? Dann ist der AsyncTask okay, du instanziert alle network sachen im DoInBackground, führst deine anfragen aus, schliesst alle connections wieder sauber.
    Willst du allerdings etwas machen das "länger" hält, also die verbindung aufrecht erhält und auf einen aktion vom server wartet um antwort zu geben, oder vielleicht alle 10sekunden etwas schickt? Dann würde ich eine separate Klasse erstellen welche einen eigenen Thread erstellet der solange läuft wie deine App läuft (oder du halt die Verbindung brauchst)

    Hallo Triton,


    ich sehe zwei sachen:
    1) mit deinem query kriegt du nur die GESAMT Spalte zurück, nie die ID spalte. Also entweder SELECT * FROM GESAMT oder SELECT _id, ORT FROM GESAMT


    2) deine primary spalte muss zwingend "_id" benannt sein, ansonsten funktioniert der CursorAdapter nicht


    Cursor Adapter:
    Adapter that exposes data from a Cursor to a ListView widget. The Cursor must include a column named "_id" or this class will not work.

    Naja das ist nur halb korrekt, dein gameloop kann schon schneller als die 60x pro sekunde iterieren, allerdings (je nach dem wie du zeichnetst, opengl? Surfaceview? OnPaint? ) wirst du nicht öfter deine view zeichnen können als das OS es dir erlaubt, deshalb das 60fps limit.

    Android (java) nimmt zum rechnen denn passensten typen (hier int) und die sind nur ganzzahlig, es wird also gerundet (immer nach unten)
    Probier mal hinter die zahlen ein "f" zu schreiben (auch bei 100!) dann werden sie als float interpretiert.


    Gruss antifish

    Zitat

    Okay, jetzt hab ichs verstanden :)
    Allerdings würde ich den Context auch nicht statisch halten. Was passiert dann wenn die Activity mit dem Context vom System destroyed wird? Dann gibts doch auch Probleme und um das zu umgehen musst trotzdem in jeder Activity deine init() Methode ausführen.


    block_


    Ja das stimmt, kann zb bei mehreren activities ein Problem sein, da währe deine Lösung sicherer. Ist immer schwierig ohne die ganze App zu kennen.


    Lg antifish

    antifish
    Zwei Klassen für eine Hilfsmethode halte ich persönlich etwas zu viel.
    Statt der zweiten non-static Klasse kann man doch genauso gut direkt die statische Methode aufrufen. (Warum ist die Tools-Klasse abstract?)


    Wenn du richtig schaust ist es nur eine Klasse, die andere ist nur zu Demonstration.
    Warum ist sie abstract? Verhindert instanzieren. Klar, Constructor private machen geht auch :)


    Deine Methode brauch genau mein .init weniger, allerdings musst du dann trotzdem IMMER den Context mitgeben, also bringt es dir gar nix wenn du in einer Klasse bist in der du keinen Zugriff auf den Context hast, ausser du löst das halt anderst, es gibt ja verschiedene möglichkeiten. Auch ein public static Context in der MainActivity währe möglich und immer das verwenden...

    Hallo maalbert,


    es hat schon seine Richtigkeit dass du .getSystemService nicht ohne Context aufrufen kannst:
    Die meisten Systemservices brauchen ja bestimmte Rechte (welche du in er manifest Datei angeben musst). Also muss die getSystemService Funktion den "Context" kennen, um bestimmen zu dürfen ob du überhaupt diese Funktion ausführen darfst.


    Hier mein Lösungsansatz, wird wohl der "sauberste" sein. Allerdings würde ich vielleicht dann zwei Tools klassen machen, eine die initalisiert werden muss mit Context, und eine "normale".


    In deiner MainActivity:

    Java
    @Overrideprotected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Tools.initTools(this); 
    NotAnActivity test = new NotAnActivity(); 
    test.testVibrator(); 
    }


    Die Testklasse ohne verfügbaren "Context":

    Java
    public class NotAnActivity { 
    
    
    public void testVibrator(){ 
    Tools.vibrate(1000); 
    } 
    
    
    }



    PS: sorry keine Ahnung wieso mein source code so komisch formatiert ist, irgendwie funktionert das mit copy-paste und "java" flag hier im editor nicht so richtig.


    Gruss


    antifish

    Ich glaub die nullpointerexception kommt davon mf.getMap()
    Da du das in deiner Activity onCreate ausgeführt hast (wo das GUI von Android nocht nich instanziert ist) hast du da null zurück bekommen. Mit dem Button funktionierts jetzt da wenn du den drückst das GUI ja da ist :D


    Probier mal den code aus deinem onclicklistener in die onStart() deiner Activity zu packen

    Kein Problem :)
    Der ViewPager + Fragments ist wahrscheinlich auch nicht das einfachste als Beginner in Sachen Android.


    An was es genau gelegen ist kann ich dir gar nicht sagen, da ich nicht weiss wie du die Referenz zu deinem Fragment2 geholt hast?
    Ich könnte mir aber vorstellen dass durch das jedesmal-neu-instanzieren deines Fragment2 im Adapter du eine Referenz zu einer nicht sichtbaren Instanz eines Fragments2 hattest und des deshalb nicht geklappt hat.


    Zum Adapter:
    Nein mit meiner Version passiert das nicht.
    Deine Version: Bei jedem Get(0 oder 1) wurde IMMER ein neues FragmentX erzeugt.
    Bei Meiner Version: Beim ersten Get(0) und beim ersten Get(1) wird geschaut ob die Variable mFramentX == null ist. Ist sie == null dann wird eine neues FragmentX erstellt und der variablen mFragmentX zugewiesen. Bei nächsten Get(0 oder 1) ist die Variable mFragmentX nicht mehr == null und es wird dann die vorherr erzeugte (also mFragmentX) verwendet. Tönt kompliziert, ist aber einfach :)
    Das ist etwas dass du auch einfach mal mit dem Debbuger Step-by-Step durchgehen kannst um zu sehen was genau passiert



    Bei SendText...:
    Mit dem getItem(x) rufts du genau das auf was du in dem Adapter codiert hast, es wird also jetzt mFragment2 zurückgegeben. Da der Adapter aber nicht ganz genau weiss was für ein Fragment das ist wird einfach ein Typ der Basisklasse (Fragment) zurückgeben. Da wir aber wissen dass das Fragment an Position 1 ein Fragment deines Types "Fragment2" zwei ist können wir den Rückgabewert von getItem() auch in diesen typ casten und danach die passDataToFragment Methode aufrufen.


    Sorry wenns ein bisschen kompliziert tönt, bin kein guter Lehrer ^^
    Würde dir aber vielleicht mal empfehlen ein Java Buch durchzumachen, mindesten den OOP Teil, zB hier
    http://openbook.galileocomputing.de/javainsel/


    Gruss
    antifish

    Danke :)
    Ah sorry das habe ich in der XML nicht gesehen, das mach ich normalerweise immer im Code O:-)


    Also den Adapter solltest du so überarbeiten (ansonsten wird bei jeder Anzeige ein neues Fragment instanziert, völlig unnötig)


    Und deine SendText so:

    Java
    public void SendText(View v) { 
    Fragment2 frag2 = (Fragment2)mSectionsPagerAdapter.getItem(1); 
    frag2.passDataToFragment("Test");}


    Ist zwar nicht der schönste Code aber funktioniert mal fürs erste ;)

    Die "IllegalStateException" kann verschiedene Gründe haben, allerdings schon mal ein gutes Zeichen (Dein "Fragment2" ist nich null :D )
    Ist zu diesem Zeitpunkt Fragment2 schon sichtbar? Also vom ViewPager schon angezeigt?
    Ansonsten zippts du mal dein Projekt und lädts es hier rauf... hab gerade Zeit da krank :-[