Android conexión a json / xml api
Estoy tratando de comunicarme con un api de reposo para recuperar un documento JSON, pero cuando ejecuto la aplicación en el emulador Android de Eclipse, la aplicación se cierra tan pronto como se inicia ("Desafortunadamente TestRest se ha detenido"). Parece cerrar debido a la llamada al método httpClient.execute.
El código de la actividad principal se encuentra a continuación:
- Renovación de la referencia $ ref de objeto deserializante de JSON a su copia original
- IOException e es nulo
- HttpClient.execute lanzando OutOfMemoryError
- Mapa Ver instrucciones de dibujo usando google Directions API - decodificar polilíneas
- Android - La llamada requiere el nivel 9 de API (el min actual es 8): android.os.StrictMode # setThreadPolicy
public class TestRestActivity extends Activity { /** Called when the activity is first created. */ TextView info; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); info = (TextView) findViewById(R.id.debug); String testUri = "http://www.entireweb.com/xmlquery?pz=MYAPIKEY&ip=IP&q=pizza&n=50&format=json"; // print the uri to the screen - (not seen if rest of code runs) info.setText(testUri); HttpClient httpclient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpGet httpget = new HttpGet(testUri); HttpResponse response = null; try { // TODO fails on this line response = httpclient.execute(httpget, localContext); HttpEntity entity = response.getEntity(); if (entity != null) { info.setText("got it"); } } catch (ClientProtocolException e) { // Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // Auto-generated catch block e.printStackTrace(); } finally { } } }
También he incluido los permisos de la web en mi archivo de manifiesto como se muestra a continuación:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.john.testRes" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.INTERNET" />
No muy familiarizado con el desarrollo de Android y realmente desorientado en cuanto a lo que está causando el problema. La API que estoy usando está bien y devuelve el documento json esperado de mi navegador. El AVD que utilizo puede conectarse a Internet en su navegador y he probado la aplicación en varios AVD diferentes.
¿Alguna sugerencia sobre lo que está causando el problema? Gracias.
Editar: errores añadidos
11-22 18:13:14.221: D/AndroidRuntime(556): Shutting down VM 11-22 18:13:14.221: W/dalvikvm(556): threadid=1: thread exiting with uncaught exception (group=0x409951f8) 11-22 18:13:14.251: E/AndroidRuntime(556): FATAL EXCEPTION: main 11-22 18:13:14.251: E/AndroidRuntime(556): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.john.testRes/org.john.testRes.TestRestActivity}: android.os.NetworkOnMainThreadException 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.access$600(ActivityThread.java:122) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.os.Handler.dispatchMessage(Handler.java:99) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.os.Looper.loop(Looper.java:137) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.main(ActivityThread.java:4340) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.lang.reflect.Method.invokeNative(Native Method) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.lang.reflect.Method.invoke(Method.java:511) 11-22 18:13:14.251: E/AndroidRuntime(556): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 11-22 18:13:14.251: E/AndroidRuntime(556): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 11-22 18:13:14.251: E/AndroidRuntime(556): at dalvik.system.NativeStart.main(Native Method) 11-22 18:13:14.251: E/AndroidRuntime(556): Caused by: android.os.NetworkOnMainThreadException 11-22 18:13:14.251: E/AndroidRuntime(556): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 11-22 18:13:14.251: E/AndroidRuntime(556): at java.net.InetAddress.getAllByName(InetAddress.java:220) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 11-22 18:13:14.251: E/AndroidRuntime(556): at org.john.testRes.TestRestActivity.onCreate(TestRestActivity.java:41) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.Activity.performCreate(Activity.java:4465) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 11-22 18:13:14.251: E/AndroidRuntime(556): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 11-22 18:13:14.251: E/AndroidRuntime(556): ... 11 more 11-22 18:13:48.321: I/Process(556): Sending signal. PID: 556 SIG: 9 11-22 18:14:01.552: D/AndroidRuntime(597): Shutting down VM
- JSON `date (...)` a `java.Util.Date` usando` org.json`
- Enviar JSONObject desde la aplicación android a node.js sobre http?
- Jackson JSON Parser rendimiento
- Cómo analizar los resultados de JSON de Unirest llamada
- ¿Cómo enviar un JSONObject a un servicio REST?
- cómo mostrar los datos json obtenidos en listview usando baseadapter
- Android Parse JSON atascado en obtener tarea
- Obtener una matriz de CLAVES para cada elemento bajo jsonarray
El problema es que está intentando realizar operaciones de red en el subproceso de interfaz de usuario principal. Necesita hacer esto en un hilo separado. Puede utilizar un AsyncTask
o simplemente un Thread
estándar.
Aquí hay un ejemplo sencillo:
final Handler handler = new Handler(); new Thread(new Runnable() { @Override public void run() { // Do something long running handler.post(new Runnable() { @Override public void run() { // Do something on the UI Thread } }); } }).start();
- Respuesta nula de HTTP Post Request Android
- ShowSoftInput no funciona después del cambio de orientación