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 28/05/12, 21:13:16
Array

[xs_avatar]
gohan0189 gohan0189 no está en línea
Miembro del foro
 
Fecha de registro: feb 2012
Mensajes: 190
Tu operador: TELCEL

problema con thread y toast

porque no puedo poner un toast aqui (lo que esta en rojo):

Código:
 Thread thread = new Thread(){       
        @Override
        public void run()
        {   
            while(realizado==false)
            {
                try{ 
                SoapObject solicitud = new SoapObject(namespace, Metodo);

          solicitud.addProperty("folioPoliza", edtxtpoliza.getText().toString());
          solicitud.addProperty("inciso", edtxtinciso.getText().toString());

          SoapSerializationEnvelope envoltorio = new SoapSerializationEnvelope(SoapEnvelope.VER11);
          envoltorio.dotNet = true;
          envoltorio.setOutputSoapObject(solicitud);
          HttpTransportSE transporte = new HttpTransportSE(url);
          
          try {         
               transporte.call(accionSoap, envoltorio);               
               Object result = (Object)envoltorio.getResponse();                             
               JSONString=result.toString();                
               
               DecoderConfiguration config = new DecoderConfiguration(false, AutoValueObject.class);
               auto = (AutoValueObject)deserializeJsonResponse(config, JSONString);                            
               realizado=true;
               
              }
                catch (Exception e)
                  {                                          
                       realizado=true;
                       x=false;
                       progressDialog.dismiss();
//                       Toast toast = Toast.makeText(getApplicationContext(), "No se pudo comunicar con el servidor", Toast.LENGTH_SHORT);
//                toast.show();
                  }                                                                                               
                    this.sleep(5000);
                } catch (InterruptedException ex) {                    
                     Toast toast = Toast.makeText(getApplicationContext(), "Proceso terminado", Toast.LENGTH_SHORT);
                     toast.show();
                }
            }            
             handler.sendEmptyMessage(0);                                                      
            
    }
        };
           
           final Handler handler = new Handler(){ 
        @Override
     public void handleMessage(Message msg) {
            
          edtxt1.setText((xxxxx).toString());
               edtxt2.setText((xxxxx2).toString());
               edtxt3.setText((xxxx3).toString());
               edtxt4.setText((xxxx4).toString());
               edtxt5.setText((xxxx5).toString());
               edtxt6.setText((xxxx6).toString()); 
               relativelayout.setVisibility(View.VISIBLE);
               btobtener.setVisibility(View.GONE);
               progressDialog.dismiss();
           
    }
si pongo el toast que esta en rojo me sale el siguiente error:

Código:
FATAL EXCEPTION: Thread-10
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.widget.Toast.<init>(Toast.java:68)
at android.widget.Toast.makeText(Toast.java:231)
at SAO.AutoHelp.Registro1$5.run(Registro1.java:182)
Activity SAO.AutoHelp.Registro1 has leaked IntentReceiver SAO.AutoHelp.Registro1$1@49dbb538 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity SAO.AutoHelp.Registro1 has leaked IntentReceiver SAO.AutoHelp.Registro1$1@49dbb538 that was originally registered here. Are you missing a call to unregisterReceiver()?
 at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.<init>(ActivityThread.java:940)
at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:735)
android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:799)
android.app.ContextImpl.registerReceiver(ContextImpl.java:786)
android.app.ContextImpl.registerReceiver(ContextImpl.java:780)
android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318)
SAO.AutoHelp.Registro1.onCreate(Registro1.java:76)
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)
android.app.ActivityThread.access$2300(ActivityThread.java:126)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:4633)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:521)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
dalvik.system.NativeStart.main(Native Method)

Última edición por gohan0189 Día 28/05/12 a las 21:18:24.
Responder Con Cita


  #2  
Viejo 28/05/12, 21:16:22
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Porque los Toast tienen que ejecutarse en el hilo principal (el único hilo que tiene acceso a la pantalla), ponlo en un Handler.
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 28/05/12, 21:22:17
Array

[xs_avatar]
gohan0189 gohan0189 no está en línea
Miembro del foro
 
Fecha de registro: feb 2012
Mensajes: 190
Tu operador: TELCEL

y si en el handler q tengo lo pongo asi :

Código:
final Handler handler = new Handler(){ 
        @Override
     public void handleMessage(Message msg) {
            if(x==true){  
          edtxttitular.setText((auto.Poliza.Titular.NombreCompleto).toString());
               edtxtinicio.setText((auto.Poliza.VigenciaInicio).toString());
               edtxtfinal.setText((auto.Poliza.VigenciaFin).toString());
               edtxtmarca.setText((auto.Marca.Descripcion).toString());
               edtxtmodelo.setText((auto.Modelo).toString());
               edtxtversion.setText((auto.Version).toString()); 
               relativelayout.setVisibility(View.VISIBLE);
               btobtener.setVisibility(View.GONE);
               progressDialog.dismiss();
           
    
}else{
Toast toast = Toast.makeText(getApplicationContext(), "No se pudo comunicar con el servidor", Toast.LENGTH_SHORT);
                toast.show();
         
}
}
serviria????? ya que en el catch del thread hago a x como false
Responder Con Cita
  #4  
Viejo 28/05/12, 21:32:00
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por gohan0189 Ver Mensaje
y si en el handler q tengo lo pongo asi :

Código:
final Handler handler = new Handler(){ 
        @Override
     public void handleMessage(Message msg) {
            if(x==true){  
          edtxttitular.setText((auto.Poliza.Titular.NombreCompleto).toString());
               edtxtinicio.setText((auto.Poliza.VigenciaInicio).toString());
               edtxtfinal.setText((auto.Poliza.VigenciaFin).toString());
               edtxtmarca.setText((auto.Marca.Descripcion).toString());
               edtxtmodelo.setText((auto.Modelo).toString());
               edtxtversion.setText((auto.Version).toString()); 
               relativelayout.setVisibility(View.VISIBLE);
               btobtener.setVisibility(View.GONE);
               progressDialog.dismiss();
           
    
}else{
Toast toast = Toast.makeText(getApplicationContext(), "No se pudo comunicar con el servidor", Toast.LENGTH_SHORT);
                toast.show();
         
}
}
serviria????? ya que en el catch del thread hago a x como false
Si, debería funcionar.
Responder Con Cita
Gracias de parte de:
  #5  
Viejo 28/05/12, 21:50:26
Array

[xs_avatar]
gohan0189 gohan0189 no está en línea
Miembro del foro
 
Fecha de registro: feb 2012
Mensajes: 190
Tu operador: TELCEL

me marca lo siguiente y no se xq??

Código:
java.lang.NullPointerException
SAO.AutoHelp.Registro1$6.handleMessage(Registro1.java:203)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:4633)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:521)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
dalvik.system.NativeStart.main(Native Method)
Responder Con Cita
  #6  
Viejo 28/05/12, 21:59:23
Array

[xs_avatar]
gohan0189 gohan0189 no está en línea
Miembro del foro
 
Fecha de registro: feb 2012
Mensajes: 190
Tu operador: TELCEL

olvidalo Kriogen era error mio gracias por la ayuda
Responder Con Cita
  #7  
Viejo 28/05/12, 23:14:50
Array

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

Aunque ya lo ha explicado perfectamente kriogeN, quería añadir otra alternativa:

Código:
runOnUiThread(new Runnable() {
    public void run() {
        Toast.makeText(getApplicationContext(), "No se pudo comunicar con el servidor", Toast.LENGTH_SHORT).show();
    }
});
El método runOnUiThread de las Activity ejecuta lo que le pases en el hilo principal, independientemente del hilo desde donde lo llames. Te ahorra definir explicitamente el handler y andar descodificando mensajes.

Una tercera opción, no ya para los Toast sino para otras cosas, son las AsyncTask, que también ejecutan tareas en el hilo principal.
__________________
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 29/05/12, 00:14:48
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Aunque ya lo ha explicado perfectamente kriogeN, quería añadir otra alternativa:

Código:
runOnUiThread(new Runnable() {
    public void run() {
        Toast.makeText(getApplicationContext(), "No se pudo comunicar con el servidor", Toast.LENGTH_SHORT).show();
    }
});
El método runOnUiThread de las Activity ejecuta lo que le pases en el hilo principal, independientemente del hilo desde donde lo llames. Te ahorra definir explicitamente el handler y andar descodificando mensajes.

Una tercera opción, no ya para los Toast sino para otras cosas, son las AsyncTask, que también ejecutan tareas en el hilo principal.
Si, de hecho he dicho Handler porque he visto que ya lo tenía puesto en el código, pero yo siempre uso runOnUiThread dentro del Thread cuando quiero hacer algo en la ventana.

El AsyncTask, como ya has dicho, para este caso creo que es demasiado elaborado para tan poca cosa.
Responder Con Cita
Gracias de parte de:
  #9  
Viejo 29/05/12, 00:36:12
Array

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

Sí, si lo comenté más por si alguien entraba en el hilo buscando que por resolver la duda -que ya la dejaste resuelta-.

De hecho, me parece más elegante el Handler, en las otras se corre el riesgo de llenar el código de runOnUiThread y al final no sabes ni qué estás ejecutando ni cuándo.
__________________
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 30/05/12, 01:22:33
Array

[xs_avatar]
gohan0189 gohan0189 no está en línea
Miembro del foro
 
Fecha de registro: feb 2012
Mensajes: 190
Tu operador: TELCEL

muchas gracias , ahora otra duda como detengo un thread???
Responder Con Cita
  #11  
Viejo 30/05/12, 01:28:03
Array

[xs_avatar]
gohan0189 gohan0189 no está en línea
Miembro del foro
 
Fecha de registro: feb 2012
Mensajes: 190
Tu operador: TELCEL

bueno lo que pasa es que tengo un codigo dentro de un boton (osea al darle click) esto es lo que hace

Código:
 progressDialog = new ProgressDialog(this);        
        progressDialog.setMessage("Cargando datos \nespere......");
        progressDialog.show();        
        thread.start();
y mi thread y handler asi

Código:
 Thread thread = new Thread(){       
        @Override
        public void run()
        {   
            while(realizado==false)
            {
                try{ 
                SoapObject solicitud = new SoapObject(namespace, Metodo);
          ///
          solicitud.addProperty("dato1", edtxt1.getText().toString());
          solicitud.addProperty("dato2", edtxt2.getText().toString());
          ///
          SoapSerializationEnvelope envoltorio = new SoapSerializationEnvelope(SoapEnvelope.VER11);
          envoltorio.dotNet = true;
          envoltorio.setOutputSoapObject(solicitud);
          HttpTransportSE transporte = new HttpTransportSE(url);
          
          try {         
               transporte.call(accionSoap, envoltorio);               
               Object result = (Object)envoltorio.getResponse();                             
               JSONString=result.toString();                
               
               DecoderConfiguration config = new DecoderConfiguration(false, AutoValueObject.class);
               auto = (AutoValueObject)deserializeJsonResponse(config, JSONString);                            
               realizado=true;
               
              }
                catch (Exception e)
                  {                                           
                       realizado=true;
                       x=false;                       

                  }                                                                                               
                    this.sleep(5000);
                } catch (InterruptedException ex) {                    

                }
            }            

             handler.sendEmptyMessage(0);

    }
        };
           
           final Handler handler = new Handler(){ 
        @Override
     public void handleMessage(Message msg) {
             if (x==true){
          //aqui solo lleno mis campos con los datos obtenidos 

               progressDialog.dismiss();

             }else{
                progressDialog.dismiss();
                Toast toast = Toast.makeText(getApplicationContext(), "No se pudo comunicar con el servidor", Toast.LENGTH_SHORT);
                toast.show();
                realizado=false;

             }
           
    }
};
ahora si hay un error en la llamada al web service me manda el toast con el problema del servidor y me regresa y al momento de volver a dar click en el boton me saca por un error de mi app y supongo q es xq le pongo de nuevo el thread.start y basicamente nunk lo he detenido o no es asi???
Responder Con Cita
  #12  
Viejo 30/05/12, 18:02:07
Array

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

Ya te has contestado tú solo, una instancia de Thread solo puede iniciarse una vez. Si necesitas volver a ejecutarlo tienes que crear una instancia nueva.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #13  
Viejo 30/05/12, 18:03:28
Array

[xs_avatar]
gohan0189 gohan0189 no está en línea
Miembro del foro
 
Fecha de registro: feb 2012
Mensajes: 190
Tu operador: TELCEL

como que una instancia nueva??
Responder Con Cita
  #14  
Viejo 30/05/12, 18:18:43
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por gohan0189 Ver Mensaje
como que una instancia nueva??
Siempre lo digo, pero aquí va una vez más, primero Java (con toda la teoría sobre POO incluida) y después Android.

Thead thread = new Thread() { ....... };

Thread es la clase, y thread es la instancia.

Para poder ejecutar thread.start() 2 veces tienes que volver a crear la instancia.

Pasado a limpio:

El código Thead thread = new Thread() { ....... }; tiene que estar justo antes del thread.start() en el mismo OnClick.
Responder Con Cita
Gracias de parte de:
  #15  
Viejo 30/05/12, 18:46:41
Array

[xs_avatar]
gohan0189 gohan0189 no está en línea
Miembro del foro
 
Fecha de registro: feb 2012
Mensajes: 190
Tu operador: TELCEL

aaaaa ok, si perdon se me fue el avion con eso de las instancias eee pjejejejeje pero ya me quedo muchas gracias a los dos
Responder Con Cita
Respuesta

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



Hora actual: 18:29:13 (GMT +1)



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

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