Beiträge von Black Rider

    Hallo zusammen


    Ich hoffe ich geh keinem auf den Wecker, weil ich schonwieder ne Frage stelle ;) (Ansonsten bitte melden)


    Ich habe für meine MySQL Verbindungen eine einzige Klasse. Darin sieht es
    immer so aus. Die Funktion wird aufgerufen. Diese ruft die Funktion
    Connection_Open auf, mach danach das was sie zu tun hat und ruft dann
    Connection_Close auf. Fertig.


    Im Code sieht das dann so aus:



    x_Group
    ist in diesem Fall einfach eine Klasse um mit den Rückgabewerten
    umzugenen, im Normalfall gleich wie die Tabelle im MySQL Server


    Code
    public class x_Group
    {
    	public Integer id = 0;
    	public Integer fromuserid = 0;
    	public String name = "";
    }


    Natürlich
    hat es in dieser MySQL Klasse auch noch andere Funktionen, nebst dieser
    Group_Download_Group auch noch Funktionen für das Herunterladen des
    Users etc.


    Jetzt folgendes:

    • Mein App startet in der MainActivity. (Loginseite)
    • Eingabe des Usernamen's und des Passworts
    • Drücken auf Login
    • Abgleich im AsyncTask mit dem Passwort vom User in der Datenbank (Hash Code)
    • Prüfen
      ob die Gruppe "General" existiert mit dem oben aufgelisteten Code.
      (Funktioniert!) (Wenn sie nicht existiert noch eine erstellen)
    • Wenn das Userpasswort i.o. war, wenn ja, ab zur nächsten Activity.
    • Dort werden alle Gruppen heruntergeladen und in einen Spinner geschrieben.
    • Der User kann die Werte eintragen um einen neuen Eintrag zu machen und drückt auf speichern.
    • Damit
      die Gruppenid herausgefunden werden kann, wird wieder der
      Group_Download_Group aufgerufen. (Wohlbemerkt, welche ja vorhin schon
      super seinen Dienst verrichtet hat!

    Fehler bei
    Connection_Open() -->
    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
    Could not create connection to database
    Ich verstehe es nicht.


    • Die Klasse MySQL wird jedes mal neu erstellt.
    • Die Funktion welche benutzt wird funktioniert, da sie ja früher im Code schonmal erfolgreich verwendet wurde.
    • OpenConnection wird bis zu diesem Punkt mehrere male erfolgreich aufgerufen.
    • Verbidnung wird jedes mal durch Connection.Close wieder geschlossen.

    Aufruf der Funktion:

    Code
    c_MySQL MySQL = new c_MySQL();
               
     Integer groupid = 
    MySQL.Group_Download_Group(c_Glob_Variables.MyUser_Get().id, 
    Spinner_gorup.getItemAtPosition(Spinner_gorup.getSelectedItemPosition()).toString()).id;


    Parameter die übergeben werden sind in Ordnung, laut Debugger: 1 und "General"
    Variablen user, url und pass im Connection_open welche nicht funktionieren sind auch in Ordnung.
    Getestet über mein Handy (Galaxy S3, Android 4.3) über WLan
    Datenbank MySQL auf Synology NAS
    Datenbankuser hat KEINE MAX_Connections beschränkung. (Zumal ja immer alle geschlossen werden)


    Warum funktioniert es plötzlich nicht mehr?
    Gruss Black Rider

    Zitat

    Angenommen, dein ursprünglicher Code würde soweit funktionieren: da wäre
    der Sinn des Tasks direkt wieder dahin, weil du mit dem while()/sleep()
    doch wieder den MainThread blockierst...


    da kannste dann genau so gut das while() durch den Inhalt des doInBackground() ersetzen.

    Jop, das kam mir heute morgen auch in den Sinn. Ich habe jetzt alles in ein AsyncTask gesteckt. Musste halt einfach schon vorher die ganzen Variablen aus der UI fischen und mittels Parameter an den Konstrukteur des AsyncTask übergeben.


    Fazit:
    1. In onPostExecute keine AsyncTask Aufrufe, ausser wenn die Beendigung für den zeitlichen Verlauf keine Rolle spielt.
    2. Von Userinput (Button Click) bist GUI Update (Z.B: Nächstes Activity) muss alles in ein AsyncTask.


    Dank Dir für die Hilfestellung :)


    Gruss


    Black Rider

    Hey :)


    Ja, danach kommt der Auftruf der nächsten Activity. Welche noch nicht alle Daten hätte, wenn ich nicht auf die Beendigung des zweiten AsyncTask warten würde, was ja aber nicht geht, da dieser erst beendet werden kann, wenn der mit dem onPostExecute vom ersten AsyncTask raus ist.


    Meine grundelegende Frage ist, ob es nicht möglich ist, das onPostExecutes von "subasynctask" aufgerufen werden können wenn er noch im Codeblock (onPostExecute) vom hautasynctask ist?


    Ich glaube ich muss es einfach grundlegend anders programmieren....

    Hallo zusammen


    Ich habe danach gesucht, gibt ja viele Threads dazu hier. Jedoch wurde ich zu meinem "Problem" nicht fünidg. Ich hoffe das ist auch wirklich so, ansonsten endschuligt bitte.


    Allgemein ne coole Sache, in doInBackground wird in einem externen Thread alles gewerkelt und in onPostExecute kann man dann über die zurückgegebene Variable von doInBackground die Sachen an der GUI verarbeiten. Soweit alles klar.


    Jetzt habe ich aber folgendes. Ich habe einen AsyncTask und IM onPostExecute von diesem wieder einen Aufruf für andere AsyncTask.
    Jetzt habe ich festgestellt, das das onPostExecute vom zweiten AsyncTask erst aufgerufen wird, wenn das vom ersten fertig ist. Jetzt wo ich das gerade schreibe, wird mir auch klar warum, ist ja dann wieder im gleichen Thread.


    Ich habe eben folgendes Grundproblem. In meinem onPostExecute vom Hauptasynctask steht folgendes:

    Code
    new Group_CreateGenerallyGroupIfNotExist().execute(user);
                	while (!c_Glob_Variables.CheckForFinishedCheckGenerallyGroup_Get()) {
                    	try { Thread.sleep(100); }
                    	catch (InterruptedException e) { e.printStackTrace(); }
                	}


    Ich will das der onExeCute von der HauptAsyncTask erst weiter macht wenn der zweite komplett fertig ist und den Boolean demnach verändert hat. Aber so entsteht ein deadlock. Wie macht man das also? :/ Order geht sowas nicht?


    Ich hoffe ich habe es verständlich ausgedrückt :D


    Gruss Black Rider

    Naja, ist ja eigtl. auch nur richtig so. Keine will ein stockendes Handy.


    Ich habe jetzt die ganze Sache in einem AsyncTask gemacht (Coole Sache :D)



    xml so belassen wie beim HelloWorld example vom Android Studio (Also einfach ein TextView drin) und in der AndroidManifest.xml muss das noch rein:


    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


    Und dann klappt es, getestet Emulator Version 2.3 / 4.3 und Samsung Galaxy S3 mit v. 4.3


    Killphil nochmals vielen Dank für die Hilfe.


    Jetzt kanns los gehen :)


    Gruss Black Rider

    Killphil, vielen vielen Dank :D:D



    Folgendes gemacht:


    • Neuer Emulator mit Android 2.3 erstellt. (Vorher 4.3!! (Fehler))
    • Neues Projekt mit Deinem Code erstellt.
    • Auch in dieses Projekt die Internetpermission + Access_network_start in die Manifest geschrieben
    • MySQL Connector v. 5.1.31 neu heruntergeladen.

    Und was seh ich da im Emulator? Meinen Namen welcher gerade aus der Datenbank gefischt wurde :)


    Wie ich gerade sehe, funktioniert es auf meinem Handy (Samsung Galaxy S3 mit Android 4.3) nicht. Also wird die ganze Sache wirklich gewesen sein, weil es in ein Thread muss. Denn ich hatte vorher immer einen 4.3 Emulator benutzt, wie mein Handy halt.
    Warum das eigtl.? Mag es Android 3.+ nicht wenn der Mainthread durch eine Netzwerkaktion blockiert wird?
    Ich werde mir also morgen mal diesen AsyncTask angucken. Wird ja nix anderes sein, als n Backgroundworker.
    Ich dank Dir nochmal und gn8 :)
    Gruss
    Black Rider

    Konnte enoch bisschen mehr herausfinden. Der Android Device Monitor ist ja auch cool :D



    Eventuell kann jemand etwas damit anfangen. Ich leider nicht.

    Hallo zusammen


    Danke für die Antworten.


    Um sicherzugehen das mit der Datenbank alles in Ordnung ist, habe ich kurz ein C# Programm geschrieben welches mir von der einen Tabelle den ersten Wert ausliesst. Ihr hattet recht, musste vom root noch die Privilegien für % setzen, dann ging mein C# Programm.
    Mein Java App jedoch leider nicht :(


    Ich habe die newInstance() hinzugefgüt, hat sich nicht geändert.


    Ich gebe aber nicht auf, werde jetzt weiter nach der Lösung suchen.
    Wenn jemand noch einen Tipp hat, nur her damit :D


    Gruss Black Rider


    PS: Danke für die Editierung, war vollkommend richtig, aber ich hatte es schon geändert. Würde als rootpasswort doch nie lulu nehmen xD

    Hallo zusammen


    Da bin ich wieder. Ich hoffe dieses mal liegt es nicht nur an der Schreibweise xD


    Ich will mein App mit meinem MySQL Server im Netzwerk verbinden.
    Es ist eine MySQL Datenbank welche auf meinem Synology NAS läuft. Die Datenbank ist erstellt und mit einem, aus dem I-Net gefischten Tool, auch auf erreichbarkeit geprüft worden.
    Die Firewall auf meinem Computer ist deaktiviert und das emulierte Andorid L von Android Studio hat auch Internet (Mit dem Browser kann ich Google aufrufen)


    Mir ist bewusst, das ich wegen der Sicherheit über ein php Script gehen sollte. (Habe die anderen Thread zum SQL Server hier gelesen, nebst gefühlten 10 Millionen anderen Threads im Internet zu diesem Thema :)), aber die App wird ausschliesslich für mich laufen, von dem her ist es nicht so wichtig :) Zudem sind es keine sesiblen Daten und wenn sie jemand löschen sollte, ist es mir auch egal.



    Ich will vorerst nicht mal etwas auslesen, ich will nur eine Verbidnung aufbauen, aber nichtmal das klappt :(


    Code:



    Fehlermeldung:
    Communications link failure


    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.





    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


    Habe ich auch in die Mainifext geschrieben. Benutzt wird JDBC v. 5.1.31.


    Aktuelles Snippet habe ich von hier:
    http://stackoverflow.com/quest…ection-with-drivermanager
    Und bei dem scheint es ja nach dem richtigen setzen der Rechte zu funktionieren, aus diesem Grund gehe ich auch absichtlich mit root drauf (Testweise), da sollte ich auch alle Rechte haben.


    Was kann da falsch sein? :/


    Gruss Black Rider

    Hallo zusammen


    Da ich neu bin, kurz über mich :)
    Ich programmiere nur in meiner Freizeit, bis jetzt habe ich mich komlett C# gewidmet. (3 Jahre lang)
    Da ich nun aber eine Software für mein Handy programmieren will, hat es mich zu Java im Android Studio verschalgen.


    Seit wann? Heute x)


    Zuerst hatte ich es mit Eclipse und dem Bundle von Goolge versucht. Klappte aber hinten und vorne nicht. Aus diesem Grund habe ich mich für das Studio entschieden, auch wenn es BETA ist. Und ich muss sagen, WOW. Echt nice ;)


    Tortzdem habe ich jetzt ein Problem.
    "Cannot resolve symbol 'string'"
    bei
    string Test1 = "";


    an der gleichen Stellte funtkioniert
    int Test2 = 2;


    wunderbar.


    Ich habe selbstverständlich schon im Internet danach gesucht. Viele haben das Problem, und jeder hatte eine andere Lösung. Ich habe natürlich alle durchprobiert. Updaten des Programmes, der SDK, prüfen das kein new im activity namen ist und ein neues Projekt erstellt.


    Nicht's hat etwas gebracht.


    Anfängerfehler sind natürlich keinesfalls ausgeschlossen :D:D


    Kann mir jemand helfen? :(


    Gruss


    Black Rider