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

Respuesta
 
Herramientas
  #1  
Viejo 16/05/16, 17:46:55
Array

[xs_avatar]
Joakin60 Joakin60 no está en línea
Miembro del foro
 
Fecha de registro: oct 2015
Mensajes: 64
Tu operador: Movistar

Problema con public void processFinish

A ver si alguien puede ayudarme, me explico: Tengo una actividad con dos fragment, en uno van los datos generales que obtengo de una base de datos y en el otro el mapa de situación.
Los datos los obtengo de una base de datos con una clase que extiende de AsyncTask en onPostExecute(String nombre). Una vez que he obtenido los datos (en este caso el nombre), este lo tengo que pasar a la actividad principal a:
public String getMyNombre() {
return nombreArte;
}
Y desde ahí recogerlo en el fragment con:
String nombreArte = activityId.getMyNombre();
((TextView) rootView.findViewById(R.id.nombreArteGeneral)).set Text(nombreArte);
Para eso paso el nombre de onPostExecute con:
delegate.processFinish(nombre);
y lo recojo en la Actividad con:
public void processFinish(String outnombre){
String nombreArte=outnombre;
Toast.makeText(this, nombreArte, Toast.LENGTH_LONG).show();
}
El problema me surge en como pasar la variable (nombreArte) de este método (processFinish) a getMyNombre() ya que processFinish está declarado como void y por lo tanto no puedo pasar los parámetros con return nombreArte.
Si alguien puede ayudarme se lo agradecería mucho, pues ando muy despistado.
PD: El Toast funciona perfectamente.
Responder Con Cita


  #2  
Viejo 16/05/16, 19:16:19
Array

[xs_avatar]
Nonamed Nonamed no está en línea
Colaborador/a
· Votos compra/venta: (4)
 
Fecha de registro: feb 2011
Localización: Madrid
Mensajes: 175,527

@Joakin60:,

Movemos a la sección de desarrollo.
__________________
Nonamed
Moderación y soporte a usuarios
Responder Con Cita
  #3  
Viejo 16/05/16, 20:04:07
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

¿El processFinish está en la misma clase que el getMyNombre()?

Entonces te basta con poner "nombreArte = outnombre;"

Lo que no puedes es poner "String nombreArte = outnombre;" porque entonces estás definiendo una variable nueva, no usando el nombreArte de la clase.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #4  
Viejo 16/05/16, 20:29:35
Array

[xs_avatar]
Joakin60 Joakin60 no está en línea
Miembro del foro
 
Fecha de registro: oct 2015
Mensajes: 64
Tu operador: Movistar

Problema con public void processFinish

Lo primero, gracias por tu respuesta. Sí, están en la misma clase y llevas toda la razón con el String, pero quitando el String tampoco funciona. Te envío un código resumido de la clase:
public class ArteCulturaGeneral extends AppCompatActivity implements AsyncResponse{
ArteGeneralDetails asyncTask =new ArteGeneralDetails();
String nombreArte;
@override
protected void onCreate(Bundle savedInstanceState) {
asyncTask.delegate = this;

asyncTask.execute();
}
@override
public void processFinish(String outnombre){
nombreArte=outnombre;
Toast.makeText(this, nombreArte, Toast.LENGTH_LONG).show();
}
public String getMyNombre() {
return nombreArte;
}

class ArteGeneralDetails extends AsyncTask<String, String, String> {
public AsyncResponse delegate = null;

protected void onPostExecute(String nombre) {
pDialog.dismiss();
delegate.processFinish(nombre);
}
}
}
Responder Con Cita
  #5  
Viejo 16/05/16, 20:36:37
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

¿Qué es lo que no funciona? Creo que entonces no he entendido qué querías hacer
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #6  
Viejo 16/05/16, 20:50:15
Array

[xs_avatar]
Joakin60 Joakin60 no está en línea
Miembro del foro
 
Fecha de registro: oct 2015
Mensajes: 64
Tu operador: Movistar

Problema con public void processFinish

Quiero pasar el valor de la variable nombreArte de:
public void processFinish(String outnombre){
nombreArte=outnombre;
}
a:
public String getMyNombre() {
return nombreArte;
}
Para recogerla en el fragment con:
String nombreArte = activityId.getMyNombre();
((TextView) rootView.findViewById(R.id.nombreArteGeneral)).set Text(nombreArte);
Y lo que no funciona es que en:
public String getMyNombre() {
return nombreArte;
}
No recojo la variable NombreArte.
Responder Con Cita
  #7  
Viejo 16/05/16, 21:26:54
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

¿Y qué es lo que recoges?

A ver si estás llamando al get antes de que la tarea haya acabado, y entonces el valor que esperas todavía no está en la variable porque no se ha llamado todavía al processFinish
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #8  
Viejo 16/05/16, 22:17:48
Array

[xs_avatar]
Joakin60 Joakin60 no está en línea
Miembro del foro
 
Fecha de registro: oct 2015
Mensajes: 64
Tu operador: Movistar

Problema con public void processFinish

No recojo nada en el campo de texto, efectivamente es como si la variable no existiera. Parece ser que es lo que tu dices, llama al get pero no le pasa la variable, por lo que sea la variable no está en uso en ese momento. Lo que no me explico, pues la secuencia debería ser:
1.asyncTask.execute();
2.delegate.processFinish(nombre);
3.processFinish(String outnombre)
4.getMyNombre()
Y parece que lee todo de un tirón y no pasa la variable a getMyNombre.
Mal apaño le veo.

Última edición por Joakin60 Día 17/05/16 a las 12:41:14.
Responder Con Cita
  #9  
Viejo 17/05/16, 14:07:37
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Tienes un problema de conceptos importante:
1 - La variable "no se pasa al get". La variable pertenece a la clase y con el get la lees, y te devuelve el valor que tenga en ese momento. La variable existe siempre, si nunca le has dado valor su valor será null. Si en algún momento de la vida ejecutas la asyncTask, termina, llama a un método y le cambias el valor (lo que haces en el processFinish), la variable cambiará su valor y tendrás que llamar al get otra vez para obtener el nuevo valor.
2 - La gracia de las AsyncTask es que se ejecutan en paralelo con el resto del código, así que para nada se ejecuta en secuencia. Tu código se sigue ejecutando, no se espera a que termine la tarea. Lo que tienes son dos hilos de ejecución, el principal que estabas usando y la secuencia paralela de acciones del asyncTask (execute, hacer sus cosas, llamar al processFinish)

El código donde llamas al getMyNombre() deberías llamarlo cuando acabe la tarea y no en el onCreate que supongo que es lo que estás haciendo. Y ya que te has creado el método processFinish para que la AsyncTask te comunique que ha terminado y guardar el valor, es ahí donde ya puedes usar ese valor donde quieras y actualizar el TextView o hacer lo que haga falta.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #10  
Viejo 24/05/16, 23:53:00
Array

[xs_avatar]
Joakin60 Joakin60 no está en línea
Miembro del foro
 
Fecha de registro: oct 2015
Mensajes: 64
Tu operador: Movistar

He estado devorándome y no me aclaro, creo que mi código es correcto menos en el problema que tengo: se ejecuta el hilo principal y no puedo pasar mi variable de la actividad a unos de los fragment (que creo con un adapter).
Bien está lo que me dices: que el hilo principal y Asyntask van por separado, y luego “…la variable cambiará su valor y tendrás que llamar al get otra vez para obtener el nuevo valor”. ¿Va de coña?
Eso es lo que estoy intentando resolver ¿Dónde?

Muchas gracias por tus consejos y los que me seguirás dando.

Última edición por Joakin60 Día 25/05/16 a las 00:00:09.
Responder Con Cita
  #11  
Viejo 25/05/16, 00:34:04
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

¿En la clase donde tienes el processFinish tienes alguna referencia al fragment que quieres modificar? Porque en ese caso es tan fácil como crear un método en el fragment en plan setNombre(String nombre) y llamarlo, y que el fragment ya actualice el textview o lo que tenga que hacer.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #12  
Viejo 25/05/16, 01:55:10
Array

[xs_avatar]
Joakin60 Joakin60 no está en línea
Miembro del foro
 
Fecha de registro: oct 2015
Mensajes: 64
Tu operador: Movistar

Más de lo mismo

En la misma clase.
La única referencia a los frament (que le había dado vueltas) en la Actividad es su creación: el adapter (intermediarios útiles que en este caso no afectan al problema).
viewPager.setAdapter(new PagerAdapterArqueologia(
getSupportFragmentManager()));
Tu solución crear un método en el fragment… me parece interesante: si la montaña no va a Mahoma, Mahoma va a la montaña, pero las variables las tiene Mahoma, no la montaña.
Por si te refieres a:
Arqueolog fragArqueolog = new Arqueolog();
fragArqueolog.setArguments(bundle);
no funciona.
Tiene que ser más fácil.

Última edición por Joakin60 Día 25/05/16 a las 02:28:21.
Responder Con Cita
  #13  
Viejo 25/05/16, 09:55:41
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

La montaña no hace falta moverla, pero tienes que avisar al fragment de que ya está el nombre disponible para que lo lea y haga sus cosas. La forma más sencilla es tener un método en el fragment y llamarlo en el processFinish. Porque volvemos a lo mismo, antes no puedes hacer nada con el nombre porque no lo tienes todavía, lo que necesites hacer tiene que ser a raíz de ejecutarse processFinish.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #14  
Viejo 03/06/16, 20:11:52
Array

[xs_avatar]
Joakin60 Joakin60 no está en línea
Miembro del foro
 
Fecha de registro: oct 2015
Mensajes: 64
Tu operador: Movistar

Solución

Lo primero muchas gracias por tu tiempo y tus conocimientos, me has sido de mucha ayuda.
Ha sido un drama aclararme con los fragments, pero llevabas toda la razón, en el fragment he declarado este método:
public void establecerNombre(final String nombre){
// Lo que tenía que hacer con el nombre
}
La solución es muy simple, pero joder que dolor de cabeza para instanciar el fragment, el código queda así.
public void processFinish(String outnombre){
if (viewPager.getCurrentItem() == 0) {
Arqueolog fragmentarte = (Arqueolog)viewPager.getAdapter().instantiateItem( viewPager, viewPager.getCurrentItem());
fragmentArte.establecerNombre(outnombre);
} else if (viewPager.getCurrentItem() == 1) {
Mapa fragmentArteMapa = (Mapa)viewPager.getAdapter().instantiateItem(viewP ager, viewPager.getCurrentItem());
}
}
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 05:08:55 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /