Ver la Versión Completa : thread y handler ayudaaaa!!!
gohan0189
10/05/12, 18:02:29
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
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
handler.sendEmptyMessage(0);
y el error es lo siguiente
FATAL EXCEPTION: main
java.lang.NullPointerException
at SAO.AutoHelp.Inicio$3.handleMessage(Inicio.java:13 4)
at android.os.Handler.dispatchMessage(Handler.java:99 )
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.jav a:4633)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:616)
at dalvik.system.NativeStart.main(Native Method)
gohan0189
10/05/12, 18:03:47
aaa estas son las variables que ocupo
Button btregistrar;
boolean imagen;
int x;
Resources res;
Drawable drawable;
RelativeLayout al;
hecsagis
10/05/12, 20:03:48
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)
gohan0189
10/05/12, 20:19:00
aa si perdon si tengo asi imagen ==true
gohan0189
10/05/12, 20:21:11
imagen se vuelve false cuando le dan click a un boton pero el error me surge cuando llega a la linea de
handler.sendEmptyMessage(0);
Arasthel
10/05/12, 20:52:38
¿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.
gohan0189
10/05/12, 20:56:02
en la 134 esta public void handleMessage(Message msg) y lo otro no te entendi??
Arasthel
10/05/12, 21:04:33
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.
gohan0189
10/05/12, 21:19:21
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?
gohan0189
10/05/12, 21:20:08
solo al, drawable no es null
Arasthel
10/05/12, 21:30:30
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:
RelativeLayout al = (RelativeLayout) findViewById(R.id.id_del_relativelayout);
Un saludo.
gohan0189
10/05/12, 21:42:52
si eso si lo tengo, asi es todo mi codigo
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 :(
Arasthel
10/05/12, 21:49:48
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.
gohan0189
10/05/12, 22:36:45
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
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);
}
};
}
Arasthel
10/05/12, 22:53:32
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.
gohan0189
11/05/12, 16:20:33
pero lo de registro y registro no afecta o si?
gohan0189
11/05/12, 16:38:45
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??
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
gohan0189
11/05/12, 17:42:51
gracias Arasthel (http://www.htcmania.com/member.php?u=149377) 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
handler.sendEmptyMessage(0);
por
handler.post(cambiarimagen);
y tambien le cambie lo del handler
final Handler handler = new Handler();
final Runnable cambiarimagen = new Runnable() {
public void run() {
al.setBackgroundResource(z);
}
};
vBulletin® v3.8.1, Copyright ©2000-2026, Jelsoft Enterprises Ltd.