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 10/05/12, 18:02:29
Array

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

thread y handler ayudaaaa!!!

hola buen dia a todos

Estoy tratando de que cada cierto tiempo se vayan mostrando imagenes en mi layout y se me ocurrio hacerlo asi pero me sale un error

Código:
 Thread thread = new Thread(){       
        @Override
        public void run()
        {   
            while(imagen=true)
            {
                try{
//                    res = getResources();
//                    drawable = res.getDrawable(R.drawable.carro);
              x=x+1;
             if (x<=10){
             res = getResources(); //resource handle
         drawable = res.getDrawable(R.drawable.carro);              
             }
             
              if (x>=20){
                 res = getResources();
                 drawable = res.getDrawable(R.drawable.info); 
              }
              if (x>=30){
                 res = getResources();
                 drawable = res.getDrawable(R.drawable.tel); 
                 x=0;
              }            
                handler.sendEmptyMessage(0);         
                    this.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
                }
            }       
    }
        };
       
        private Handler handler = new Handler()
        {
        @Override
            public void handleMessage(Message msg)
            {                  
                al.setBackgroundDrawable(drawable);
            }
        };
no se si este bien estructurado y por eso quiero pedir ayuda el error es el siguiente y lo manda cuando entra a esta linea
Código:
handler.sendEmptyMessage(0);
y el error es lo siguiente

Código:
FATAL EXCEPTION: main
java.lang.NullPointerException
 at SAO.AutoHelp.Inicio$3.handleMessage(Inicio.java:134)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:123)
 at android.app.ActivityThread.main(ActivityThread.java:4633)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:521)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
 at dalvik.system.NativeStart.main(Native Method)
Responder Con Cita


  #2  
Viejo 10/05/12, 18:03:47
Array

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

aaa estas son las variables que ocupo

Button btregistrar;
boolean imagen;
int x;
Resources res;
Drawable drawable;
RelativeLayout al;
Responder Con Cita
  #3  
Viejo 10/05/12, 20:03:48
Array

[xs_avatar]
hecsagis hecsagis no está en línea
Desarrollador
· Votos compra/venta: (1)
 
Fecha de registro: mar 2009
Mensajes: 266
Modelo de smartphone: Nexus 5
Tu operador: Vodafone
No he mirado el resto, me he parado aquí:

while(imagen=true)

Te falta un igual, sino siempre es verdad la condición:

while(imagen==true)

Quizá con ese bool estás controlando algún parámetro que te causa el error al no ser nunca false (o quizá si quieres que eso sea siempre true, no sé cierto al no ver el resto del programa)
Responder Con Cita
  #4  
Viejo 10/05/12, 20:19:00
Array

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

aa si perdon si tengo asi imagen ==true
Responder Con Cita
  #5  
Viejo 10/05/12, 20:21:11
Array

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

imagen se vuelve false cuando le dan click a un boton pero el error me surge cuando llega a la linea de

Código:
  handler.sendEmptyMessage(0);
Responder Con Cita
  #6  
Viejo 10/05/12, 20:52:38
Array

[xs_avatar]
Arasthel Arasthel no está en línea
Cocinero veterano
· Votos compra/venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Tu operador: Amena
¿Qué código hay en esta línea (Inicio.java:134) y alrededores?

Si es la línea que has puesto antes, ¿seguro que "al" y "drawable" han sido inicializadas en el momento de la ejecución del Handler?

Un saludo.
Responder Con Cita
  #7  
Viejo 10/05/12, 20:56:02
Array

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

en la 134 esta public void handleMessage(Message msg) y lo otro no te entendi??
Responder Con Cita
  #8  
Viejo 10/05/12, 21:04:33
Array

[xs_avatar]
Arasthel Arasthel no está en línea
Cocinero veterano
· Votos compra/venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Tu operador: Amena
Métete con el depurador, el debugger y haz que pare justo antes de ejecutar el "al.setBackgroundDrawable(drawable);" poniendo un breakpoint en esa línea. Cuando esté parado ahí, mira la lista de variables de arriba a la derecha, busca "al" y "drawable" y comprueba que no estén a null, que es lo que casi seguro que causa el NullPointerException.

Un saludo.
Responder Con Cita
  #9  
Viejo 10/05/12, 21:19:21
Array

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

si esta null, pero pues es que antes de ejecutarse el handler solo lo ocupo aqui

RelativeLayout al;

y en el handler es donde le especifico la imagen no??? o q mas tengo que hacer?
Responder Con Cita
  #10  
Viejo 10/05/12, 21:20:08
Array

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

solo al, drawable no es null
Responder Con Cita
  #11  
Viejo 10/05/12, 21:30:30
Array

[xs_avatar]
Arasthel Arasthel no está en línea
Cocinero veterano
· Votos compra/venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Tu operador: Amena
Las variables son punteros a memoria. Cuando solo especificas el tipo de variable ("RelativeLayout al;", sin ningún "= new ...." o "= findViewById(...)"), lo único que haces es reservar un pequeño espacio en memoria para guardar la variable más adelante. Con lo cual, si no le dices al código qué debe de contener la variable "al", dicha variable apunta a un espacio vacío de memoria, a "null" o "nada".

Por eso, al usar tu código lo que haces es decirle "ponle a NADA esta imagen de fondo". Y ya imaginas cómo se queda la app cuando la intentas ejecutar. Para poder usar la variable "al", debes ponerle en alguna parte del código a qué layout haces referencia mediante la ID (android:id en el xml), con el método findViewById. Te pongo un ejemplo:

Código:
RelativeLayout al = (RelativeLayout) findViewById(R.id.id_del_relativelayout);
Un saludo.
Responder Con Cita
  #12  
Viejo 10/05/12, 21:42:52
Array

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

si eso si lo tengo, asi es todo mi codigo

Código:
public class Inicio extends Activity{
     Button btregistrar;
     boolean imagen;
     int x;
     Resources res;
     Drawable drawable;
     RelativeLayout al;
     ImageView image;
     
     @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //this.requestWindowFeature(Window.FEATURE_NO_TITLE);
       // imagen=true;        
        
        btregistrar=(Button)findViewById(R.id.btregistrar);  
        al = (RelativeLayout) findViewById(R.id.rela);
                        
        BroadcastReceiver finalizar2 = new BroadcastReceiver()
        {
        @Override
        public void onReceive(Context arg0, Intent arg1) 
          {
           finish();
          }
    };
        registerReceiver(finalizar2, new IntentFilter("cerrar2"));
                 
        SharedPreferences prefs = getApplicationContext().getSharedPreferences("Registro",Context.MODE_PRIVATE);
        boolean registro = prefs.getBoolean("isregistro",false);
        SharedPreferences prefs2 = getApplicationContext().getSharedPreferences("RespaldoRegistro",Context.MODE_PRIVATE);
        boolean registro2 = prefs2.getBoolean("isregistro2",false);
        String poliza = prefs2.getString("poliza","");
        String inciso = prefs2.getString("inciso","");  
        
         if (registro==true && registro2==true){
            
             Intent intent = new Intent(getBaseContext(),Rsiniestro1.class);
             startActivity(intent);                                 
             Inicio.this.finish();
             
        }else if (registro==true){
            Intent intent = new Intent(getBaseContext(),Rsiniestro1.class);
             startActivity(intent); 
              Inicio.this.finish();
                
    }else{
             setContentView(R.layout.inicio);
             thread.start();        
             
     }  
                  
        }
       public void registrar(View v) 
             {  
             imagen=false;
             Intent intent = new Intent(getBaseContext(),Registro1.class);
             startActivity(intent); 
             }
     
      Thread thread = new Thread(){       
        @Override
        public void run()
        {   
            while(imagen==true)
            {
                try{
                                  
          
              x=x+1;
             if (x<=10){
                 
             res = getResources(); //resource handle
         drawable = res.getDrawable(R.drawable.carro);              
             }
             
              if (x>=20){
                 res = getResources();
                 drawable = res.getDrawable(R.drawable.info); 
              }
              if (x>=30){
                 res = getResources();
                 drawable = res.getDrawable(R.drawable.tel); 
                 x=0;
              }            
                    handler.sendEmptyMessage(0);            
                    this.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
                }
            }       
    }
        };
       
        private Handler handler = new Handler()
        {
        @Override
            public void handleMessage(Message msg)
            {                  
                al.setBackgroundDrawable(drawable);
            }
        };
    }
talves asi puedas decirme que estoy haciendo mal
Responder Con Cita
  #13  
Viejo 10/05/12, 21:49:48
Array

[xs_avatar]
Arasthel Arasthel no está en línea
Cocinero veterano
· Votos compra/venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Tu operador: Amena
Por lo que veo no hay "setContentView()" antes de decirle que te busque "al" en el layout. Imagino entonces que no sabe dónde buscar y por eso deja la variable a null.

El setContentView que tienes en el else quizás debería de ir al principio.

Un saludo.
Responder Con Cita
Gracias de parte de:
  #14  
Viejo 10/05/12, 22:36:45
Array

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

decidi cambiar unas cosas y mi codigo quedo asi pero ahora solo me muestra la primera imagen y no hace los cambiios ni si quiera entra al thread xq sera?? (no hagas caso a las lineas comentadas) fue lo q le quite

Código:
public class Inicio extends Activity{
     Button btregistrar;
     boolean imagen;
     int x,z;
     Resources res;
     Drawable drawable;
     RelativeLayout al;
     ImageView image;
     
     @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.inicio);
       
        //this.requestWindowFeature(Window.FEATURE_NO_TITLE);
       // imagen=true;        
        
        btregistrar=(Button)findViewById(R.id.btregistrar);  
        al = (RelativeLayout) findViewById(R.id.rela);
                        
        BroadcastReceiver finalizar2 = new BroadcastReceiver()
        {
        @Override
        public void onReceive(Context arg0, Intent arg1) 
          {
           finish();
          }
    };
        registerReceiver(finalizar2, new IntentFilter("cerrar2"));
                 
        SharedPreferences prefs = getApplicationContext().getSharedPreferences("Registro",Context.MODE_PRIVATE);
        boolean registro = prefs.getBoolean("isregistro",false);
        SharedPreferences prefs2 = getApplicationContext().getSharedPreferences("RespaldoRegistro",Context.MODE_PRIVATE);
        boolean registro2 = prefs2.getBoolean("isregistro2",false);
        String poliza = prefs2.getString("poliza","");
        String inciso = prefs2.getString("inciso","");  
        
         if (registro==true && registro2==true){
            
             Intent intent = new Intent(getBaseContext(),Rsiniestro1.class);
             startActivity(intent);                                 
             Inicio.this.finish();
             
        }else if (registro==true){
            Intent intent = new Intent(getBaseContext(),Rsiniestro1.class);
             startActivity(intent); 
              Inicio.this.finish();
                
    }else{
             z=R.drawable.carro;  
             al.setBackgroundResource(z);
             thread.start();
            
//            res = getResources(); //resource handle
//         drawable = res.getDrawable(R.drawable.carro);              
           
          
             
     }  
                  
        }
       public void registrar(View v) 
             {  
             imagen=false;
             Intent intent = new Intent(getBaseContext(),Registro1.class);
             startActivity(intent); 
             }
     
      Thread thread = new Thread(){       
        @Override
        public void run()
        {   
            while(imagen)
            {
                try{
                      
              x=x+1;
             if (x<=10){
                 
//             res = getResources(); //resource handle
//         al.setBackgroundResource(R.drawable.carro); 
             z=R.drawable.carro;
//This function will change background drawable, so place it where you want.
//        al.setBackgroundDrawable(drawable);
             }
             
              if (x>=20){
        //         res = getResources();
                   z=R.drawable.info;
                  
//                 al.setBackgroundResource(R.drawable.info);
//                 al.setBackgroundDrawable(drawable);
              }
              if (x>=30){
//                 res = getResources();
                   z=R.drawable.tel;
//                 al.setBackgroundResource(R.drawable.tel); 
//                 al.setBackgroundDrawable(drawable);
                 x=0;
              }            
                    handler.sendEmptyMessage(0);            
                    this.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
                }
            }       
    }
        };
       
        private Handler handler = new Handler()
        {
        @Override
            public void handleMessage(Message msg)
            {                  
                al.setBackgroundResource(z);
            }
        };
    }
Responder Con Cita
  #15  
Viejo 10/05/12, 22:53:32
Array

[xs_avatar]
Arasthel Arasthel no está en línea
Cocinero veterano
· Votos compra/venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Tu operador: Amena
Ahí ya me he perdido. Me resulta muy raro lo que comentas de que no entra al thread. El problema puede estar con las variables registro y registro2, pero no sabría decirte...

Un saludo.
Responder Con Cita
  #16  
Viejo 11/05/12, 16:20:33
Array

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

pero lo de registro y registro no afecta o si?
Responder Con Cita
  #17  
Viejo 11/05/12, 16:38:45
Array

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

o a ti no se te ocurre alguna forma para hacer lo que quiero , el ir cambiando las imagenes de mi layout cada cierto tiempo??
Responder Con Cita
  #18  
Viejo 11/05/12, 16:55:36
Array

[xs_avatar]
edu27 edu27 no está en línea
Usuario poco activo
· Votos compra/venta: (1)
 
Fecha de registro: jul 2010
Mensajes: 44
Modelo de smartphone: Galaxy Nexus
Tu operador: Yoigo
la variable boolean imagen no está inicializada, y en el único momento en el que la modificas la pones a false y creo que por ese método no pasas.

Por lo tanto tienes que poner a true la variable imagen.

Enviado desde mi Galaxy Nexus usando Tapatalk 2
Responder Con Cita
Gracias de parte de:
  #19  
Viejo 11/05/12, 17:42:51
Array

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

gracias Arasthel ya me quedo, hice unos cambios en el handler e inicialize imagen =true como me dijo edu 27 gracas por todo les dejo lo que cambie

esto lo puse dentro del thread lo cambie
Código:
 handler.sendEmptyMessage(0);
por

handler.post(cambiarimagen);
y tambien le cambie lo del handler

Código:
final Handler handler = new Handler();
 
final Runnable cambiarimagen = new Runnable() {
    public void run() {
         al.setBackgroundResource(z);
    }
};
Responder Con Cita


Respuesta

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



Hora actual: 19:30:41 (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 / 邮件联系 /