[GELÖST] Android PHP MySQL

T

Tomax63

Neues Mitglied
2
Hallo zusammen

Ich habe ein PHP-Programm, das mir einen JSON String anzeigt:

[{"ID":"1","Text":"text 1"},{"ID":"2","Text":"text 2"},{"ID":"3","Text":"weiterer text"},{"ID":"4","Text":"noch ein Text"}]

So weit ist alles gut,

Jetzt möchte ich diesen String in der App verarbeiten, das heisst erst mal in ein Array schreiben.
Nachdem ich viel versucht und gesucht habe, sollte meiner Meinung nach folgendes funktionieren:
Code:
public class DatenHolen extends AsyncTask<String, String, String> {
    private Context context;
    private ListView list;
    AlertDialog alertdialog;
    DatenHolen (Context ctx) {
        context = ctx;
    }
    @Override
    protected String doInBackground(String... params) {
        try {
            URL oracle = new URL("http://singler.ch/cuckapp/get_data.php");
            URLConnection yc = oracle.openConnection();
//            InputStream is = yc.getInputStream();      <--------- Diese Zeile
//            InputStreamReader isr = new InputStreamReader(is);
//            BufferedReader in = new BufferedReader(isr);
            String inputLine;
//            while ((inputLine = in.readLine()) != null)
//                System.out.println(inputLine);
//            in.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(String result) {
//        String[] arr = data.split("<br>");
    }
}

Wen ich die Zeile "InputStream is = ...." auskommentiere, stürzt das Programm ab. Im Android Monitor:
Code:
05-05 15:11:44.886 3485-3485/com.example.thomas.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                Process: com.example.thomas.myapplication, PID: 3485
                                                                                java.lang.IllegalStateException: Could not execute method for android:onClick
                                                                                    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                                                                                    at android.view.View.performClick(View.java:5637)
                                                                                    at android.view.View$PerformClick.run(View.java:22429)
                                                                                    at android.os.Handler.handleCallback(Handler.java:751)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                    at android.os.Looper.loop(Looper.java:154)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                                 Caused by: java.lang.reflect.InvocationTargetException
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                                    at android.view.View.performClick(View.java:5637) 
                                                                                    at android.view.View$PerformClick.run(View.java:22429) 
                                                                                    at android.os.Handler.handleCallback(Handler.java:751) 
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                    at android.os.Looper.loop(Looper.java:154) 
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
                                                                                 Caused by: android.os.NetworkOnMainThreadException
                                                                                    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
                                                                                    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
                                                                                    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
                                                                                    at java.net.InetAddress.getAllByName(InetAddress.java:752)
                                                                                    at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
                                                                                    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187)
                                                                                    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156)
                                                                                    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:98)
                                                                                    at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:345)
                                                                                    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328)
                                                                                    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
                                                                                    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
                                                                                    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
                                                                                    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:243)
                                                                                    at com.example.thomas.myapplication.DatenHolen.doInBackground(DatenHolen.java:49)
                                                                                    at com.example.thomas.myapplication.MainActivity.set_all(MainActivity.java:149)
                                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                                    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                                                                                    at android.view.View.performClick(View.java:5637) 
                                                                                    at android.view.View$PerformClick.run(View.java:22429) 
                                                                                    at android.os.Handler.handleCallback(Handler.java:751) 
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                    at android.os.Looper.loop(Looper.java:154) 
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Verstehe ich da etwas nicht bezüglich Backgroud Prozess?
Ich möchte wie gesagt nur den String aus dem PHP-Programm in ein Array einlesen um nachher Textfelder damit zu belegen.

Wäre toll, wenn mir jemand helfen könnte.

Danke,
Thomas
 
Hallo Thomas,

laut der Fehlermeldung tritt der Fehler in der onClick Methode auf.
Also ich würde mal tippen, dass dort erst mal den Fehler suchen muss und nicht in dem AsyncTask.

Ich glaube, dass du in deinem Layout eine Methode für onClick deklariert hast, die es in deinem Java Script nicht gibt. Aber ohne den restlichen Quelltext zu kennen alles nur eine Vermutung.

Gruß
Thomas
 
NetworkOnMainThreadException heißt genau das.
Kann es sein, dass du deinen AsyncTask.doInBackground von hand aufrufst? Also sowas wie new DatenHolen().doInBackground()?
Das funktioniert nicht, du musst den Task mit Android Mitteln starten mit execute statt doInBackground.
 
@thomas: Ich denke nicht, dass es daran liegt. Der Fehler tritt nicht auf, wenn ich die besagte Zeile deaktiviere.

@deek: Das klingt schon sehr schlüssog. Wie rufe ich das denn korrekt auf? Aktuell mache ich es in der MainActivity mit:
Code:
    public void set_all(View view){
        DatenHolen datenholen = new DatenHolen(this);
        String username = "tatata";
        String password = "lalala";
        String result = datenholen.doInBackground(username, password);
    }
 
Hallo alle miteinander,

normalerweise wird der AsyncTask so aufgerufen:
Code:
new datenholen(parameter1, parameter2 ...).execute();

Gibt noch ne andere Art. Wenn du mehrere AsyncTasks ablaufen lässt wird mit dem oberen Code gewartet, bis AsyncTask1 fertig ist und dann wird erst der nächste gestartet. Wenn du sie parallel laufen lassen musst, kannst du folgendes benutzen:
Code:
new datenholen(parameter1, parameter2 ...).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 
@lordzwieback:
Könntest du mir den Aufruf mal in mein Codestück einbauen? Ich krieg das nicht hin, ohne dass der halbe code rot wird.
 
Wie hast du es denn versucht? Wie sieht dein Code aus? Welche Fehler werden dir denn angezeigt und wo? Poste mal den Teil, wo du den AsyncTask aufrufst.

Wir helfen hier alle gerne, aber wir sind keine Hellseher und werden dir nicht deine App programmieren. ;)
 
Die Funktion set_all wird vom Button aufgerufen in content_main.xml:
Code:
    <Button
        android:id="@+id/bt_clr"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="16dp"
        android:layout_marginTop="8dp"
        android:onClick="set_all"
        android:text="all"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

Die Funktion selber steht in der Datei MainActivity.java:
Code:
    public void set_all(View view){
        String username = "tatata";
        String password = "lalala";
        DatenHolen datenholen = new DatenHolen(this);
        String result = datenholen.doInBackground(username, password);
    }

Und die Klasse DatenHolen steht in der eigenene Datei DatenHolen.java:
Code:
public class DatenHolen extends AsyncTask<String, String, String> {
    private Context context;
    private ListView list;
    AlertDialog alertdialog;
    DatenHolen (Context ctx) {
        context = ctx;
    }
    @Override
    protected String doInBackground(String... params) {
        try {
            URL oracle = new URL("http://singler.ch/cuckapp/get_data.php");
            URLConnection yc = oracle.openConnection();
            InputStream is = yc.getInputStream();
//            InputStreamReader isr = new InputStreamReader(is);
//            BufferedReader in = new BufferedReader(isr);
            String inputLine;
//            while ((inputLine = in.readLine()) != null)
//                System.out.println(inputLine);
//            in.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(String result) {
//        String[] arr = data.split("<br>");
    }
}

Steht da vielleicht irgendwas an der falschen Stelle?

Danke

Thomas
 
Hast du meinen Code aus Post#5 mal ausprobiert und wenn ja, wie und wo? In der set_all Methode ist noch der falsche Aufruf deines AsyncTasks drin.
 
Das klappt nicht. Wenn ich es so mache:
Code:
    public void set_all(View view){
        DatenHolen datenholen = new DatenHolen(this);
        String username = "tatata";
        String password = "lalala";
        new datenholen(username, password).execute();
        String result = datenholen.doInBackground(username, password);
    }
dann wird gemeckert "Cannot find Symbol "datenholen".

Schreibe ich sie wie die Klasse so:

new DatenHolen(username, password).execute();

Dann werden die Parameter angemeckert:
"DatenHolen(android.content.context) can not be applied to (java.lang.String, java.lang.String)

Ausserdem versteh ich nicht, wie ich bei dem Aufruf die Rückgabe von datenholen in die Variable result kriegen soll.
 
Also, du musst die Variablen (username und password) in deiner Async Klasse initialisieren und dir einen Konstruktor für deinen AsyncTask bauen. Hab hier mal ein kleines Beispiel aus einem meiner Projekte (Da gehts ums Verbinden zu einem FTP Server):

Code:
private class _async_ftp_conn extends AsyncTask<String, Void, Boolean> {
        private String host = "";
        private String username = "";
        private String password = "";

        // constructor method
        public _async_ftp_conn(String hst, String usr, String pwd) {
            this.host = hst;
            this.username = usr;
            this.password = pwd;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Mach irgendwas mit der UI Schicht, bevor der Task durchgeführt wird...
        }

        @Override
        protected Boolean doInBackground(String... strings) {
            // Dein Task, hier kannst du dann mit den Parametern arbeiten, die du aus der Konstruktormethode bekommst
           // Ich sage hier dann z.b. dass sich der FTP mit host, username und password einwählen soll
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            // Mach irgendwas mit der UI Schicht, nachdem der Task durchgeführt wird...
        }

    }

Du kannst den Rückgabetyp (Hier Boolean) der doInBackground Methode so anpassen, dass sie dem Typ deiner "result" Variable entspricht. Dieser Return wird dann an die onPostExecute Methode übergeben und dort kannst du dann anhand des übergebenen Ergebniswerts weitere Aktionen ausführen, die wieder auf deine UI Schicht Zugriff haben.

Hoffe ich hab das jetzt nicht zu ungenau beschrieben, bin gerade aufm Sprung.

Bei weiteren Fragen kannst du auch mal noch hier reinschauen: AsyncTask | Android Developers
 
Aber exakt so ist es doch bei mir. Also scheine ich in der Funktion alles richtig zu machen.
Code:
public class _DatenHolen extends AsyncTask<String, String, String > {
    private String host = "";

    public _DatenHolen(String hst, String tel, String boo){
        this.host = hst;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Mach irgendwas mit der UI Schicht, bevor der Task durchgeführt wird...
    }

    @Override
    protected String doInBackground(String... params) {
        try {
            URL mysqlconn = new URL("http://singler.ch/cuckapp/get_data.php");
            URLConnection yc = mysqlconn.openConnection();
//            InputStream is = yc.getInputStream();
//            InputStreamReader isr = new InputStreamReader(is);
//            BufferedReader in = new BufferedReader(isr);
            String inputLine;
//            while ((inputLine = in.readLine()) != null)
//                System.out.println(inputLine);
//            in.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(String result) {
//        Mach nachher was mit dem Ergebnis
    }
}

Der Code läuft auch prima wie ich ihn eingestellt habe, aber wenn ich die Zeile "InputStream is = yc.getInputStream();" aktiviere, stürzt das programm ab, wennich per Button das Programm ausführe.
 
Hallo Thomax,

bitte sei mal so lieb und poste deinen ErrorLog zum obigen Code, wenn es abstürzt
 
Hallo zusammen
Ich habe das Problem gelöst. Das Ganze wurde in eine neue Activity ausgelagert.
 

Ähnliche Themen

B
Antworten
0
Aufrufe
673
basementmedia
B
M
Antworten
4
Aufrufe
1.129
swa00
swa00
5
Antworten
0
Aufrufe
1.104
586920
5
Zurück
Oben Unten