|
||
|
|
|
|||||||
| 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 |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
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);
}
};
Código:
handler.sendEmptyMessage(0); 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) |
|
|
|
#2
|
||||
|
||||
|
aaa estas son las variables que ocupo
Button btregistrar; boolean imagen; int x; Resources res; Drawable drawable; RelativeLayout al; |
|
#3
|
||||
|
||||
|
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)
__________________
Mis apps en el Market:
https://market.android.com/search?q=hexahis&so=1&c=apps http://www.appfutura.com/dev/Hexahis |
|
#4
|
||||
|
||||
|
aa si perdon si tengo asi imagen ==true
|
|
#5
|
||||
|
||||
|
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); |
|
#6
|
||||
|
||||
|
¿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. |
|
#7
|
||||
|
||||
|
en la 134 esta public void handleMessage(Message msg) y lo otro no te entendi??
|
|
#8
|
||||
|
||||
|
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. |
|
#9
|
||||
|
||||
|
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? |
|
#10
|
||||
|
||||
|
solo al, drawable no es null
|
|
#11
|
||||
|
||||
|
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); |
|
#12
|
||||
|
||||
|
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);
}
};
}
|
|
#13
|
||||
|
||||
|
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. |
| Gracias de parte de: | ||
|
#14
|
||||
|
||||
|
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 quiteCó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);
}
};
}
|
|
#15
|
||||
|
||||
|
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. |
|
#16
|
||||
|
||||
|
pero lo de registro y registro no afecta o si?
|
|
#17
|
||||
|
||||
|
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??
|
|
#18
|
||||
|
||||
|
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 |
| Gracias de parte de: | ||
|
#19
|
||||
|
||||
|
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); Código:
final Handler handler = new Handler();
final Runnable cambiarimagen = new Runnable() {
public void run() {
al.setBackgroundResource(z);
}
};
|
|
|
![]() |
Estás aquí
|
||||||
|
||||||