|
||
|
![]() |
![]() |
Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
![]() |
|
Herramientas |
#1
|
||||
|
||||
Imagen alojada en URL
Por que en según que móviles y en el emulador si funciona este código y en mi móvil con Jelly bean customizado no me funciona...
manifest; <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="16" /> este es el código... import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.widget.ImageView; import android.widget.Toast; public class Estadisticas1Eq extends Activity { private ImageView imageView; private Bitmap loadedImage; private String imageHttpAddress = "aquiva el url"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.estadisticas1eq); imageView = (ImageView) findViewById(R.id.image_view); downloadFile(imageHttpAddress); } void downloadFile(String imageHttpAddress) { URL imageUrl = null; try { imageUrl = new URL(imageHttpAddress); HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection(); conn.connect(); loadedImage = BitmapFactory.decodeStream(conn.getInputStream()); imageView.setImageBitmap(loadedImage); } catch (IOException e) { Toast.makeText(getApplicationContext(), "Error cargando la imagen: "+e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } } |
|
#2
|
||||
|
||||
Técnicamente en ICS tampoco debería funcionarte, si te funciona en un móvil con ICS es porque ese móvil se ha saltado algunos de los "requisitos" de Google.
El problema está en que estás haciendo uso de Internet (datos en general, también valdría para red local) en el hilo principal, y a partir de ICS si quieres que la aplicación sea 100% compatible cualquier uso de Internet tiene que ser en un hilo independiente. Creo que se aplica a cualquier cosa que sea bloqueante, pero ahora mismo lo único que se me ocurre que pueda bloquear el hilo principal es una conexión de datos. |
Gracias de parte de: | ||
#3
|
||||
|
||||
Me interesa porque yo también uso ese sistema para cargar imágenes. Como debo/debemos hacer entonces para que ese sistema sea totalmente compatible con cualquier móvil? Existe algún método de cargar imágenes no muy complejo que sirva para todos en general? Gracias.
|
#4
|
||||
|
||||
Técnicamente en ICS tampoco debería funcionarte, si te funciona en un móvil con ICS es porque ese móvil se ha saltado algunos de los "requisitos" de Google.
El problema está en que estás haciendo uso de Internet (datos en general, también valdría para red local) en el hilo principal, y a partir de ICS si quieres que la aplicación sea 100% compatible cualquier uso de Internet tiene que ser en un hilo independiente. Creo que se aplica a cualquier cosa que sea bloqueante, pero ahora mismo lo único que se me ocurre que pueda bloquear el hilo principal es una conexión de datos. ![]() Enviado desde mi GT-I9000 usando Tapatalk 2 |
#5
|
||||
|
||||
Si no te has enterado de la mitad de lo que te he puesto deberías empezar por aquí: http://developer.android.com/guide/c...d-threads.html |
#6
|
||||
|
||||
A que a partir de ICS no puedes bloquear el hilo principal, también llamado UI Thread, todo lo que tenga que ver con sockets (una conexión HTTP usa sockets) tienes que ejecutarlo fuera del hilo principal. ¿Cómo hacerlo? Pues hay muchísimas formas, para tu caso lo más sencillo es usar un AsyncTask, pero también puedes meterlo todo en un Thread y cuando la imagen se haya descargado asignársela al ImageView con un RunOnUIThread o con un Handler.
Si no te has enterado de la mitad de lo que te he puesto deberías empezar por aquí: http://developer.android.com/guide/c...d-threads.html ![]() Enviado desde mi GT-I9000 usando Tapatalk 2 |
#7
|
||||
|
||||
A que a partir de ICS no puedes bloquear el hilo principal, también llamado UI Thread, todo lo que tenga que ver con sockets (una conexión HTTP usa sockets) tienes que ejecutarlo fuera del hilo principal. ¿Cómo hacerlo? Pues hay muchísimas formas, para tu caso lo más sencillo es usar un AsyncTask, pero también puedes meterlo todo en un Thread y cuando la imagen se haya descargado asignársela al ImageView con un RunOnUIThread o con un Handler.
Si no te has enterado de la mitad de lo que te he puesto deberías empezar por aquí: http://developer.android.com/guide/c...d-threads.html ![]() Como bien dice kriogeN, lo mejor es usar AsyncTask. Te dejo un tuto con mucha info por si te sirve de ayuda: http://android10.org/index.php/artic...ask-in-android Saludos! =)
__________________
|
#8
|
||||
|
||||
Solo un apunte: no puedes bloquear el UI Thread en ninguna versión de Android, no solo a partir de ICS. Si bloqueas éste thread, se producirá un error conocido como ANR (Activity Not Responding).
Como bien dice kriogeN, lo mejor es usar AsyncTask. Te dejo un tuto con mucha info por si te sirve de ayuda: http://android10.org/index.php/artic...ask-in-android Saludos! =) ![]() En cambio a partir de ICS ni cartel, ni 5 segundos, ni pollas, si bloqueas el hilo principal la aplicación no funciona. |
#9
|
||||
|
||||
Sigo pensando que ocurre en todas las versiones de Android. El ANR solo saltará cuando el hilo esté bloqueado y el usuario haga alguna acción (tocar la pantalla, pulsar un botón, etc...).
Si dejas el hilo bloqueado, pero no generas ninguna acción de usuario, el ANR no saltará y la aplicación seguirá funcionando cuando termine el procesamiento que bloquea el thread.
__________________
|
#10
|
||||
|
||||
Sigo pensando que ocurre en todas las versiones de Android. El ANR solo saltará cuando el hilo esté bloqueado y el usuario haga alguna acción (tocar la pantalla, pulsar un botón, etc...).
Si dejas el hilo bloqueado, pero no generas ninguna acción de usuario, el ANR no saltará y la aplicación seguirá funcionando cuando termine el procesamiento que bloquea el thread. ![]() android.os.NetworkOnMainThreadException Uso de sockets en hilo principal = muerte. Da igual que toques la pantalla o no la toques, en cambio en GB y anteriores si está permitido, ocurriría lo que tú dices. Pero en ICS (realmente a partir de Honeycomb) no lo está. |
#11
|
||||
|
||||
Uop! Touché!
Desconocía que habían hecho una Exception a ese nivel. Gracias! ^^
__________________
|
#12
|
||||
|
||||
Por lo que veo también me pide todo este tema para lanzar twitter en la App... en Jelly Bean me peta la App. Mirando el Log Cat el fallo se concentra en el botón que te lleva a los permisos (login)... creo que si no me equivoco necesito darle/ incluir un AsyncTask en ese botón por lo menos para que llegue a la petición de permiso, verdad?
|
![]() |
![]() |
||||||
|
Herramientas | |