Foros del Web » Programando para Internet » Android »

Limitar el tiempo de ejecución de un hilo AsyncTask

Estas en el tema de Limitar el tiempo de ejecución de un hilo AsyncTask en el foro de Android en Foros del Web. Hola a todos, un saludo. Estoy empezando con esto de las aplicaciones en android. Y ya he creado una aplicación que se conecta directamente a ...
  #1 (permalink)  
Antiguo 30/07/2014, 18:05
Avatar de calichecal  
Fecha de Ingreso: junio-2009
Ubicación: Colombia
Mensajes: 288
Antigüedad: 15 años, 6 meses
Puntos: 12
Busqueda Limitar el tiempo de ejecución de un hilo AsyncTask

Hola a todos, un saludo.

Estoy empezando con esto de las aplicaciones en android. Y ya he creado una aplicación que se conecta directamente a una base de datos en mysql.

Todo funciona perfectamente, ya había programado en java y solo tuve que familiarizarme con la clase AsyncTask para realizar la conexión en un hilo aparte.

Pero aplicando el plan de pruebas a esta aplicación, me di cuenta que si se corta la conexión a Internet en el momento en que este hilo esta intentando realizar la conexión, entonces este hilo se queda en una ejecución permanente. Por ello quisiera colocar un limite de tiempo para que este proceso establezca conexión, pero no se como.

Esta es mi subclase de AsyncTask:

Código:
	class HiloConexion extends AsyncTask<Integer, Void, Integer> {

	    

	    @Override protected void onPreExecute() {
	    	
	    	estado.setTextSize(20);
	    	estado.setTextColor(Color.parseColor("#239F00"));
		estado.setText(R.string.login_progress_signing_in);	
		entrar.setClickable(false);
    		usuario.setEnabled(false);
    		mPasswordView.setEnabled(false);
	    
	    }


	    @Override protected void onPostExecute(Integer result) {
		
	    	
	    	entrar.setClickable(true);
    		usuario.setEnabled(true);
    		mPasswordView.setEnabled(true);

	    	
	    	if(result == 1){
	    		
	    	    estado.setText("");
	            Intent intent = new Intent(LoginActivity.this, VehiculosActivity.class)
	            .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
	            intent.putExtra("usuarioBD",usuarioBD);
	            startActivity(intent);
	            
	            
	    
         
	            
	    	}else if(result == 2){
	    		
	    		estado.setText("");
	    		
	    		Toast.makeText(getApplicationContext(), "Por favor verifique su conexión a internet",
                        Toast.LENGTH_LONG).show();	
	    		
	    	}else{
	    		
	    		
	    		estado.setTextColor(Color.RED);
			estado.setTextSize(15);
			estado.setText(R.string.datos_incorrectos);
	    	}			

	    }

		@Override
		protected Integer doInBackground(Integer... arg0) {

			
			
			if(Mysql.crearConexion()){

				if(verificarUsuario()){
					
					return 1;
				}else{
					return 0;
					
				}

			}else{
				return 2;
			}			
			
		}

	}
Y este es el método estático de la clase Mysql que llamo en la clase anterior:

Código:

	public static boolean crearConexion() {
		try {
			if (mySQLConn == null)
				mySQLConn = DriverManager.getConnection(url, user, pass);
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

Agradezco sus consejos y aportes !! Me despido.
__________________
Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad. -Einstein-

Última edición por calichecal; 30/07/2014 a las 18:11
  #2 (permalink)  
Antiguo 30/07/2014, 18:17
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Limitar el tiempo de ejecución de un hilo AsyncTask

Este es un tema recurrente, no traten de conectarse directamente a su base de datos. Tienen que exponer la db por medio de un webservice.

http://stackoverflow.com/questions/7...221716#7221716
  #3 (permalink)  
Antiguo 30/07/2014, 20:04
Avatar de calichecal  
Fecha de Ingreso: junio-2009
Ubicación: Colombia
Mensajes: 288
Antigüedad: 15 años, 6 meses
Puntos: 12
Respuesta: Limitar el tiempo de ejecución de un hilo AsyncTask

Cita:
Iniciado por razpeitia Ver Mensaje
Este es un tema recurrente, no traten de conectarse directamente a su base de datos. Tienen que exponer la db por medio de un webservice.

http://stackoverflow.com/questions/7...221716#7221716
Hola, muchas gracias por responder. Investigaré el tema.
__________________
Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad. -Einstein-
  #4 (permalink)  
Antiguo 31/07/2014, 08:07
Avatar de El_Metallick  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 22 años, 1 mes
Puntos: 16
Respuesta: Limitar el tiempo de ejecución de un hilo AsyncTask

Primero que todo, sumarme a lo que dice razpeitia con respecto al uso de webservices como método de comunicación entre la aplicación Android y el servidor de base de datos. En este post comente algo de lo que ha sido mi experiencia con el uso de webservices.

Ahora, con respeto a tu pregunta sobre limitar el tiempo de vida de una tarea asíncrona, o en su defecto, darle un timeout, la verdad es que no se si existe una forma directa pero al menos cuando yo lo necesité hacer, lo solucione de la siguiente manera:

Código Java:
Ver original
  1. boolean flag = true;
  2.  
  3. miTareaAsincrona = new __TareaAsincrona();
  4. miTareaAsincrona.execute(Params...);
  5.  
  6. miHandler = new Handler();
  7.  
  8. miRunnable = new Runnable() {
  9.     @Override
  10.     public void run() {
  11.         if(flag) {
  12.             flag = false;
  13.         } else {
  14.             miTareaAsincrona.cancel(true);
  15.  
  16.                 //Lo que sea necesario hacer al cancelar la tarea
  17.         }
  18.  
  19.         miHandler.postDelayed(this,10000);
  20.     }
  21. };
  22.  
  23. miRunnable.run();

Explicación: En realidad lo que se hace, es una ejecución repetitiva cada 10 segundos en este caso (dado por los 10000). La primera vez que entra, como la flag es verdadero, simplemente cambia la flag a falso, si luego de 10 segundos (periodo en el que se vuelve a ejecutar el fragmento de código) aún no ha concluido la tarea asíncrona, pues la cancelo y realizo alguna acción de ser necesario.

IMPORTANTE: Para el correcto funcionamiento, es necesario decirle a la tarea repetitiva que no es necesario que se siga ejecutando una vez que responde la tarea asíncrona, esto a grandes rasgos sería mas o menos así:

Código Java:
Ver original
  1. private class __TareaAsincrona extends AsyncTask<String, Void, Boolean> {
  2.     protected Boolean doInBackground(String... params) {
  3.         if (this.isCancelled()) {
  4.             return null;
  5.         }      
  6.        
  7.         //lo que haga la tarea asíncrona
  8.  
  9.         return ture|false;
  10.     }
  11.    
  12.     protected void onPostExecute(Boolean result) {
  13.         if(!this.isCancelled()) {
  14.             if(result) {
  15.                 miHandler.removeCallbacks(miRunnable);
  16.  
  17.                 //lo que tenga que hacer cuando termina la tarea asíncrona
  18.             }
  19.         }
  20.     }
  21. }

Espero se entienda la idea y te sea de ayuda.

Salud(os)
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!

Etiquetas: conexion, mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:49.