PDA

Ver la Versión Completa : [ CONSULTA ] Imagen alojada en URL


sgsbarna
01/11/12, 18:47:06
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();
}
}
}

kriogeN
01/11/12, 18:55:59
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.

superroko2
01/11/12, 20:20:10
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.

sgsbarna
02/11/12, 19:44:48
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.

A que te refieres con un hilo independiente?

Enviado desde mi GT-I9000 usando Tapatalk 2

kriogeN
02/11/12, 21:07:40
A que te refieres con un hilo independiente?

Enviado desde mi GT-I9000 usando Tapatalk 2

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/components/processes-and-threads.html

sgsbarna
02/11/12, 21:38:32
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/components/processes-and-threads.html

Si si... había buscado por internet... lo tengo claro ahora toca implementarlo... pero tengo entendido el problema de pasarlo todo por el hilo principal... gracias.

Enviado desde mi GT-I9000 usando Tapatalk 2

manelizzard
03/11/12, 12:09:12
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/components/processes-and-threads.html

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/articlesother/342-threads-handlers-and-asynctask-in-android

Saludos! =)

kriogeN
03/11/12, 13:47:58
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/articlesother/342-threads-handlers-and-asynctask-in-android

Saludos! =)

Pero en versiones anteriores a ICS te sale lo de "Aplicación no respondiendo. Esperar o Cerrar", y sólo sale después de 5 segundos. Si bloqueas menos de 5 segundos (un socket salvo que la conexión falle o tenga mucho peso lo que descargues debe tardar menos de 5 segundos) ni siquiera sale el cartel. Y aunque salga si le das a Esperar la aplicación sigue funcionando.

En cambio a partir de ICS ni cartel, ni 5 segundos, ni pollas, si bloqueas el hilo principal la aplicación no funciona.

manelizzard
03/11/12, 14:24:09
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.

kriogeN
03/11/12, 14:51:58
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.

Esto existe sólo a partir de HoneyComb, y demuestra lo que te digo:

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á.

manelizzard
03/11/12, 15:18:59
Uop! Touché!

Desconocía que habían hecho una Exception a ese nivel. Gracias! ^^

sgsbarna
04/11/12, 11:59:56
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?