0 votos

Saludos

Estoy desarronado una app en ANDROID para realizar peticiones REST a un microcontrolador, todo funciona bien mientras se ejecuta una a la vez, pero necesito que mientras se precione el boton (cualquiera) se mantega la peticion REST. Este es el codigo de lo que he pododo hacer pero la app se traba cuando sostengo el boton. Le di pausa al proceso y nada. podrian ayudarme a solucionar este evento.

 

  public  boolean onTouch (View v, MotionEvent event) {

            switch (v.getId()) {

                case  R.id.btUP:

                while (event.getAction() == ACTION_DOWN)

                {
                    new AsyncTask<Void, Void, Boolean>() {
                        @Override
                        protected Boolean doInBackground(Void... params) {
                            HttpClient httpClient = new DefaultHttpClient();
                            HttpGet httpget = new HttpGet(peticion);

                            try {
                                httpClient.execute(httpget);
                            } catch (Exception e) {
                                cancel(true);  //con y sin cancel se traba
                                e.printStackTrace();

                            }                     

                            return false;
                        }
                    }.execute();
                       }
                    break;

 

preguntado por Camilo Parada Garcia Feb 4, 2015 en Android

1 Respuesta

+1 voto
Mejor respuesta

Hola Camilo,

el while que estás haciendo te debe estar generando un montón de hilos. Además este while está en primer plano. Casi te viene mejor crear un hilo que pregunte al botón si está pulsado, y dentro de este hilo si quieres el while que llame al Rest. Luego el código te quedaría algo así:

miButton.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // Al pulsar el botón creamos una única vez el hilo que llamará continuamente al servidor con el Rest
            break;
        case MotionEvent.ACTION_UP:
            // Al levantar el dedo del botón cancelamos el hilo en segundo plano
            break;
        }
        return false;
    }
});

 

respondido por Ramon [Admin] Feb 5, 2015
seleccionada por Ramon [Admin] Feb 5, 2015

Gracias en verdad funciono.

Una ultima pregunta, hacer lo sigueinte es valido, o es "limpio" en cuanto a programacion se refiere.
 

HttpClient httpClient = new DefaultHttpClient();
HttpClient httpClient1 = new DefaultHttpClient();
HttpGet httpget = new HttpGet(peticion1);
HttpGet htt = new HttpGet(peticion2);

try {
    httpClient.execute(httpget);
    httpClient1.execute(htt);



Funciono, pero quiero asegurarme que no genere algun problema a futuro.

Gracias por la ayuda.

Si haces un par de peticiones en un hilo en segundo plano no deberías de tener ningún problema. Podrías hacer cada una en un hilo aparte si ya te quieres asegurar del todo y para que se hagan en paralelo.

Pues, para lo que estoy trabajando sirve asi, Muchas gracias Ramon.

podrias ayudarme a manejar HttpResponse, es decir un ejemplo de como se usaria, ya tengo mi dato enviado, un navegador comun muestar en la pantalla algo como

"Pin D13 set to 1".

deseo capturar el 1 pero en un dispostivo ANDROID, creeria que es con HttpResponse, pero si es asi, no se como capturarlo.

Te agradezco una vez mas en lo que me puedas ayudar.

Correcto, para obtener un dato de Internet tienes que utilizar HttpResponse. Una vez que tienes el String obtenido por HttpResponse solo te falta descomponerlo para utilizar lo que necesitas. Para ello te recomiendo utilizar una expresión regular, tienes ejemplos para Java en http://jarroba.com/busqueda-de-patrones-expresiones-regulares/

Muchas gracias por la info adicional, tengo una nueva duda, necesito enviar continuamente la peticion REST mientras esta activo ACTION_DOWN pero no se como y he intentado buscar info del tema, pero todo lleva a una sola pulsacion, tambien lo intento en el microcontrolador, pero se queda atrapado, lo que me hace pensar que mi unica opcion es enviar continuamente el REST. ¿tienes algun consejo para mi situacion?.
No debería quedarse bloqueado al hacerse en otro hilo la petición Rest. Otra cosa que es importante es que retrases un poco cada petición, para no consumir todos los datos.