![]() |
|
| 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 |
«
Tema Anterior
|
Siguiente tema
»
|
|
Herramientas |
|
#1
|
|
Duda con AsyncTask
(Click para mostrar/ocultar)
Reutilizo el post para no crear otro nuevo. Estoy teniendo problemas utilizando la clase AsyncTask. La app consiste en dos sencillas Activities, la primera lanza el Intent a la segunda sin problemas. La segunda Activity tiene 2 TextViews, al principio solo se muestra uno, mientras que el segundo permanece oculto. Hasta aquí todo OK. El segundo TextView debería mostrarse al concluir la AsyncTask, pero la aplicación da FC cuando esto pasa .Aquí los códigos: - Layout. Código:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/MainLinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/CalculoMensaje"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/calculo_mensaje"
android:layout_weight="1"/>
<TextView
android:id="@+id/ResultadosMensaje"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:layout_weight="4"
android:visibility="invisible"/>
</LinearLayout>
Código:
public class Calculo extends Activity
{
TextView view;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
view = (TextView) findViewById(R.id.ResultadosMensaje);
setContentView(R.layout.calculo_activity);
calculoAsincrono task = new calculoAsincrono();
task.execute();
}
public class calculoAsincrono extends AsyncTask<Void, Void, Double>
{
@Override
protected Double doInBackground(Void... params)
{
// Cálculos realizados durante 60 segundos.
return index;
}
@Override
protected void onPostExecute(Double index)
{
StringBuilder builder = new StringBuilder();
builder.append("Tu CPU ha realizado " + index + " operaciones en un minuto.");
view.setText(builder.toString());
view.setVisibility(TextView.VISIBLE);
}
}
}
Prefiero investigar y aprender por mí mismo antes que que me expliquen los errores, pero esto me trae de cabeza Alguna solución? Saludos! Solucionado, solo había que cambiar la línea "TextView view;" dentro del método "onCreate". Última edición por Bongiovi Día 14/07/13 a las 18:45:58 |
|
|
|
#2
|
||||
|
||||
|
El problema está en que los cálculos seguro que los estás haciendo en el hilo principal, y lo que es más, en el onCreate de la Activity. ¿Me equivoco?
Para solucionar tu problema tienes que hacer lo siguiente: 1) Establecer al segundo TextView como INVISIBLE (o GONE, esto ya a gusto del efecto que quieras) 2) En el onCreate lanzar un AsyncTask, que durante su doInBackground realice los cálculos. 3) Finalmente en el onPostExecute del AsyncTask estableces el setText del TextView y lo haces VISIBLE. |
|
#3
|
|
|
Cita:
![]() Esto de AsyncTask me suena a chino, ahora me informaré en android developers. Muchas gracias, saludos! |
|
#4
|
|
Exactamente necesitas hacer los calculos en otro hilo para que que el principal no se demore y muestre la interfaz , asynctask es una de las mejores opciones.
|
|
#5
|
||||
|
||||
|
Dado que la tarea es de muy larga duración, para hacerlo bien del todo deberías detener los cálculos cuando la actividad pase al estado de onPause u onStop.
Si no, cuando el usuario cambie de aplicación porque le llaman o recibe un mensaje estará la tarea de fondo robando CPU y enlenteciendo el sistema entero sin necesidad porque la actividad ni si quiera se está mostrando ya. Lo comento porque las AsyncTask no se detienen solas cuando la actividad se detiene. P.D: La nueva forma "elegante" de inicializar/cargar/calcular datos al iniciar una actividad son los Loader, si bien en tu caso es matar moscas a cañonazos. |
|
#6
|
|
|
Cita:
Ahora mismo estoy leyendo sobre las tareas en segundo plano en sgoliver. Gracias y un saludo. |
|
#7
|
|
Otro problema, esta vez relacionado con la clase Bundle.
Tengo dos activities, en el Intent que va de una a otra incluyo un objeto de la clase Bundle, el cual incluye un string. Pues bien, una vez estoy en la segunda activity, el método getString("nombreDeLaVariable") de la clase Bundle me devuelve "null". He puesto un breakpoint y el Bundle contiene el String, ¿que pasa aquí? |
|
#8
|
||||
|
||||
|
No se como estarás pasando el parámetro en la primera Activity, pero prueba con esto en la segunda:
getIntent().getStringExtra("nombredelavariable") Si te sigue dando NULL, para poner el parámetro en la primera Activity usa esto, y suponiendo que el Intent que declaras se llame "intent": intent.putExtra("nombredelavariable",objeto_tipo_s tring) |
|
#9
|
|
|
Cita:
![]() Supongo que el problema es que el Bundle no reconocía el string como tal, no? |
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 06:34:57 (GMT +1)
HTCMania: líderes desde el 2007

.






