Posts
Suponía que habría alguna forma de hacerlo en java y suponía que de alguna forma utilizaría hilos.
Después de darle vueltas a un par de clases y tratar que un hilo desde el método run pudiermos lanzar una excepción resulta que hay otras maneras. Una de ellas, algo engorrosa utiliza clases del paquete concurrent de java. Es un especie de ejecutor de tareas al que le tenemos que pasar una clase que implemente un interfaz determinado. Luego lanzamos esa clase con un tiempo de timeout (en segundos o como queramos).
Si la tarea, que es asíncrona (en este caso está a la espera de lo que haga el usuario) no se termina, salta una excepción que desconocía que es TimeoutException.
Todo está basado en un post que encontré, pero en lugar de mostrarlo en partes, he metido todo en una clase para poder reutilizarlo en cualquier lado. En el código está la url de la solución que encontré, muy bien documentada.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.Callable;
import java.util.concurrent.
import java.util.concurrent.
import java.util.concurrent.
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.
/**
* @author Pello Xabier
* As seen on
* http://www.javaspecialists.eu/
*/
public class TimedInput {
private long timeoutSecs;
// Necesitamos una clase que implemente Callable que haga la tarea
// De desta manera la podemos invocar desde un Executor
private class ConsoleReadLineTask implements Callable<String> {
/**
* método que debemos implementar para el interfaz Callable
* @return String
* @throws IOException
*/
public String call() {
BufferedReader reader = new BufferedReader(new
InputStreamReader(System.in));
String readedInput = null;
try {
readedInput = reader.readLine();
} catch (IOException ioe) {
}
return readedInput;
}
}
/**
* el constructor
* @param timeoutSecs el número de segundos que esperaremos
*/
public TimedInput (long timeoutSecs) {
this.timeoutSecs = timeoutSecs;
}
/**
* readLine
* Este método es que el se invocará desde cualquier lado para recoger
* información, y encapsula todo el tema del timeout
* @param msg que se muestra al usuario para pedir datos
* @return un String con lo que se ha escrito o null en caso de timeout.
*/
public String readLine(String msg) {
ExecutorService executorService = Executors.
String readedInput = null;
try {
// Future lo utilizamos para recoger el resultado
// de una tarea asíncrona, vamos, de la task que hemos preparado
Future<String> result = executorService.submit(new
ConsoleReadLineTask());
try {
System.out.println(msg);
// Aquí está la madre del cordero: espera el resultado un
determinado tiempo
// en caso de que no se haya completado la tarea SALTA UNA
EXCEPCIÓN DE TIMEOUT
// gracias a la cual sabemos que el usuario NO ha escrito nada.
readedInput = result.get(timeoutSecs, TimeUnit.SECONDS);
} catch (TimeoutException e) {
System.out.println("Timeout, no has escrito nada, dejamos
de esperar");
result.cancel(true);
} catch (Exception e) {
// capturamos cualquier cosa, for the sake of simplicity
// and the glory of your mother
}
} finally {
// esto detiene todas las tareas en ejecución y las que
estuvieran en espera
executorService.shutdownNow();
}
// Si salió bien devolveremos lo recogido en la Task que tiene el readLine
// y si no, va un null.
return readedInput;
}
}
En el algún foro también he visto alguna solución aún más simple.
http://www.coderanch.com/t/232213/threads/java/implement-timeout-threads
chaos
Esto es una especie de aplicación web para subir distintos tipos de contenidos (enlaces, textos, imágenes,...) para uso privado, para compartir o para colgar cosas de forma anónima. La aplicación tiene este aspecto:
La idea es que evolucione a otra cosa pero no sé muy bien hacia qué. En cualquier caso deseché la idea de usar frameworks e hice un MVC muy muy básico, todo ello con php+mysql y pensado para que no de problemas para instalar en ningún host gratuito.
Esta sería la pantalla en la que se suben nuevos items:
Puedes ver el código y descargarte el proyecto en github: Descargar chaos
O puedes hacer alguna prueba en la web de pruebas: http://chaos.cx
Mientras se meten comandos en una consola o sobre todo mientras programas en cualquier entorno o mientras ojeas documentación o mientras haces todo eso a la vez puedes llegar poco a poco a un nivel de concentración que en un entorno favorable puede llegar al deep hack.
(http://catb.org/jargon/html/H/hack-mode.html)
En cualquier trabajo si te interrumpen dicen que se tarda unos 10 minutos en volver a recuperar la concentración. ¿Cómo se puede volver al trance de forma más ágil?
Hay música que quizá pueda ayudar a alcanzar ese estado semimístico. Hay mucho para elegir y por supuesto los gustos pueden variar, en mi caso me decanto por aquellas que más o menos siguen una misma pauta, es decir, NO me pongo un popurri de pachanga, heavy metal y clásica aleatoria.
Últimamente le he echado una oreja a muchas bandas sonoras de películas y videojuegos y hay auténticas joyas que pueden allanar el camino hacia el hack mode.
Por si le sirve a alguien de inspiración aquí pongo una lista de álbumes que suelo utilizar mientras le doy a la tecla:
- OST Warhammer Spacemarine, la banda sonora del videojuego.
- OST Inception, la banda sonora de Origen.
- OST Prometheus, la peli en fin, la BSO cojonuda.
- OST Silent Hill 1, el videojuego. Algo enfermizo, para trances profundos ;)
- OST El Ilusionista
- OST Alien & OST Aliens
- OST Conan the Destroyer
- OST Magic, no confundir con las cartas de los cojones, es una peli antigua de Anthony Hopkins
- Death Metal Técnico: Necrophagist, sus dos últimos discos
- Death Metal Técnico: Gorod, Process of a new Decline
- Death Metal Técnico: A Loathing Requiem, Psalms of Misanthropy
- Trash Metal: Angelus Apatrida, The Call
- Heavy Metal: Children of Bodom, sobre todo el Hatebreeder y el Follow the Reaper
En un clase se pueden sobrecargar los metodos y los constructores, e incluso se pueden asignar valores por defecto a los parametros (como en php). Veamos el ejemplo del coche un poco mas desarrollado.
Locales en Android
Android permite crear aplicaciones multilenguaje de forma fácil gracias a los resources. Los resources nos dan más trabajo pero nos permiten separar la presentación del código. Para crear aplicaciones que soporten varios lenguajes no tenemos más que duplicar directorios como values, layout, etc... incluso los drawables. Por ejemplo:
- values
- values-es
- values-fr
Con eso Android se encargaría de buscar el contenido correspondiente. Siempre hay que dejar lso directorios por defecto como el values, layout para los casos en los que android no pille lo que necesita.
Acceso a Web desde Android
- Utilizar un WebView, que es un View especial para cargar html de la red.
- Utilizar las clases httpclient para hacer peticiones get
- Utilizar httpclient para hacer post.
Mapas y geolocalización
La cámara
Switchers y lectores de XML
Dialogs
En android existen una serie de Dialogs habituales en otros entornos:
- Alerts
- Selectores de Fecha
- Selectores de hora
- Selectores de caracteres
- Progreso
Además de eso podemos definir nuestros propios dialogs, indicando un fichero de layout propio y con los controles que queramos. Aquí se pueden ver algunos ejemplos:
subscribe via RSS