|
||
|
|
|
|||||||
| 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
|
||||
|
||||
|
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();
}
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. |
|
|
|
#2
|
||||
|
||||
|
Porque los Toast tienen que ejecutarse en el hilo principal (el único hilo que tiene acceso a la pantalla), ponlo en un Handler.
|
| Gracias de parte de: | ||
|
#3
|
||||
|
||||
|
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();
}
}
|
|
#4
|
||||
|
||||
|
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();
}
}
![]() |
| Gracias de parte de: | ||
|
#5
|
||||
|
||||
|
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) |
|
#6
|
||||
|
||||
|
olvidalo Kriogen era error mio gracias por la ayuda
|
|
#7
|
||||
|
||||
|
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();
}
});
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!
|
| Gracias de parte de: | ||
|
#8
|
||||
|
||||
|
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();
}
});
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 AsyncTask, como ya has dicho, para este caso creo que es demasiado elaborado para tan poca cosa. |
| Gracias de parte de: | ||
|
#9
|
||||
|
||||
|
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!
|
| Gracias de parte de: | ||
|
#10
|
||||
|
||||
|
muchas gracias , ahora otra duda como detengo un thread???
|
|
#11
|
||||
|
||||
|
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();
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;
}
}
};
|
|
#12
|
||||
|
||||
|
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!
|
| Gracias de parte de: | ||
|
#13
|
||||
|
||||
|
como que una instancia nueva??
|
|
#14
|
||||
|
||||
|
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. |
| Gracias de parte de: | ||
|
#15
|
||||
|
||||
|
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
|
![]() |
Estás aquí
|
||||||
|
||||||