[API 22] - JSON e Android

di il
7 risposte

[API 22] - JSON e Android

Salve,

ho il mio script php sul server in locale all'indirizzo http://127.0.0.1/server.ph.

<?php
require_once("set.php");
/**
* ServerManageAndroid
*	
*
*/

mysql_connect($IP_DB,$US_DB,$PASS_DB);
mysql_select_db("test");
$sql=mysql_query("SELECT nome FROM Utente");
while($row=mysql_fetch_assoc($sql)) $output[]=$row;

print(json_encode($output));

mysql_close();

?>
Ora voglio che la mia stringa JSON venga letta dalla mia applicazione.
Posto il codice:

package com.luigi.android.applicazione;


import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.ListActivity;
import android.os.Bundle;



/**
 * Created by Luigi on 26/05/15.
 */
public class Utenti extends ListActivity {

    private static final String TAG = "UtentiActivity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list);

        try {

            //apro connessione con il server
            URL url = new URL("http://127.0.0.1/server.php");
            URLConnection urlConnection = url.openConnection();
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            System.out.println("urlConnection: *** openConnection() ***");

            /*

            }catch(IOException io){
                System.out.println("IO:::" + io.getMessage());
            }finally {
                    urlConnection.disconnect();
                }
                */
        
        }catch (IOException io) {
            System.out.println("ex:" + io.getMessage());
        }

    }
}
Il problema è che se voglio programmare con API 22 devo usare openConnection() che non ho mai usato.
Qualcuno che è più esperto di me, sa dirmi come fare ?

P.S ho dato i permessi per internet nell' AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"    />
Grazie in anticipo

7 Risposte

  • Re: [API 22] - JSON e Android

    Ciao, in alternativa alla URLConnection potresti usare HttpClient se prefersci. In entrambi i casi occhio che l'indirizzo 127.0.0.1 si riferisce all'emulatore, mentre se vuoi accedere dall'emulatore al pc devi usare l'indirizzo 10.0.2.2 (vedi la documentazione)


    Inviato dal mio iPhone utilizzando Tapatalk
  • Re: [API 22] - JSON e Android

    Grazie Della,
    è molto probabile che l'errore sia dovuto all'indirizzo, testo entro mezz'ora ti dico.
    HttpClient è soppressa nell'API 22, correggimi se dico una stronzata
  • Re: [API 22] - JSON e Android

    Ho modificato il codice relativo così:
    
    URL url = new URL("http://10.0.2.2/server.php");
    URLConnection urlConnection = url.openConnection();
    BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
    
    Ma continua a crashare l'applicazione e mi da errore sull'ultima riga che ho scritto.
  • Re: [API 22] - JSON e Android

    Ciao, ho controllato ed in effetti l'HttpClient è stato deprecato nelle API 22.

    Per quanto riguarda il crash posta anche il LogCat, altrimenti è impossibile capire cosa sta succedendo
  • Re: [API 22] - JSON e Android

    Questo è il log .. nudo e crudo !
    
    05-27 21:35:29.980    2160-2175/com.luigi.android.applicazione W/EGL_emulation? eglSurfaceAttrib not implemented
    05-27 21:35:29.980    2160-2175/com.luigi.android.applicazione W/OpenGLRenderer? Failed to set EGL_SWAP_BEHAVIOR on surface 0xa5101660, error=EGL_SUCCESS
    05-27 21:35:30.065    2160-2160/com.luigi.android.applicazione D/AndroidRuntime? Shutting down VM
    05-27 21:35:30.071    2160-2160/com.luigi.android.applicazione E/AndroidRuntime? FATAL EXCEPTION: main
        Process: com.luigi.android.applicazione, PID: 2160
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.luigi.android.applicazione/com.luigi.android.applicazione.Utenti}: android.os.NetworkOnMainThreadException
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
                at android.app.ActivityThread.access$800(ActivityThread.java:151)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:135)
                at android.app.ActivityThread.main(ActivityThread.java:5257)
                at java.lang.reflect.Method.invoke(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:372)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
         Caused by: android.os.NetworkOnMainThreadException
                at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
                at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
                at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
                at libcore.io.IoBridge.connect(IoBridge.java:122)
                at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
                at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
                at java.net.Socket.connect(Socket.java:882)
                at com.android.okhttp.internal.Platform.connectSocket(Platform.java:174)
                at com.android.okhttp.Connection.connect(Connection.java:152)
                at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
                at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
                at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
                at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
                at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:199)
                at com.luigi.android.applicazione.Utenti.onCreate(Utenti.java:34)
                at android.app.Activity.performCreate(Activity.java:5990)
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390)
                at android.app.ActivityThread.access$800(ActivityThread.java:151)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:135)
                at android.app.ActivityThread.main(ActivityThread.java:5257)
                at java.lang.reflect.Method.invoke(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:372)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
    
    
  • Re: [API 22] - JSON e Android

    L'errore è NetworkOnMainThreadException, ovvero cerchi di fare operazioni di rete sul thread principale. Questo è un comportamento "pericoloso" perché le operazioni di rete sono lente, per cui rischi (con alta probabilità) di "freezare" la tua app finché queste operazioni non sono completate. La soluzione è quella di fare le operazioni di rete su un thread separato (vedi ad esempio gli AsyncTask o anche librerie esterne, come AsyncHttpClient)
  • Re: [API 22] - JSON e Android

    Infatti la mia app viene freezata
    Ti ringrazio comunque gentilissimo, vado a guardarmi gli AsyncTask
Devi accedere o registrarti per scrivere nel forum
7 risposte