Actualmente Turpial está presentando fallas con mucha frecuencia. La más común y grave es que deja de actualizar absolutamente todo. La aplicación se pone en un estado como "suspendido", donde la vista responde pero no actualiza nada (timeline, menciones, directos, etc) y al tratar de realizar otra función relativa a la API, por ejemplo tuitear, simplemente se queda colgado intentando para siempre.
Presumo, por lo que he podido observar durante el error y por los logs que he leído, que el problema está directamente relacionado con la API. Está pasando "algo" que está congelando el hilo y por ésta razón no se ejecuta ninguna otra tarea; todas quedan en la cola.
La API necesita refactorización desde hace algún tiempo y creo que la hora ha llegado, por eso abro este hilo. A continuación trataré de comentar e ilustrar un poco el modelo actual y el modelo que tengo en mente para la optimización, de esa forma podemos discutir y lograr la mejor solución.
Nota: no soy muy experto con esto de los diagramas de flujo así que pido disculpas de antemano por cualquier aberración xD
En el modelo actual [1] se observa el flujo desde que comienza la petición en la vista hasta que llega a la API. En ese punto, mediante funciones que están fuera del hilo (o fuera de la función run de la clase) se agrega la solicitud a la cola. Luego dentro del hilo se gestiona la cola, si no hay solicitudes pendientes se espera 300ms antes de procesar la siguiente. Si hay una solicitud pendiente se construye la URL de la petición y se procesa. Esto incluye autenticación segura (oauth) y otras tareas que, por la complejidad, es posible que generen errores no detectados y contribuyan al cuelgue de la API. Adicionalmente el resultado de la petición HTTP es procesado usando condicionales para detectar el tipo de petición y funciones que están fuera del hilo. Posteriormente ese resultado procesado es devuelto a la vista para que actualice los controles pertinentes.
En el modelo propuesto [2] la parte inicial de la solicitud permanece igual, los cambios se observan a partir de la gestión de la cola. En este punto entra en acción una nueva clase llamada Protocolo. Esta clase hereda de una interfaz común donde estarán las definiciones básicas de las funciones que debe tener cualquier protocolo, de esta forma se deja abierta la posibilidad para integrar muchos otros protocolos de microblogging. En esta clase protocolo también está una clase nueva llamada TurpialHTTP. Con ésta clase se pretende gestionar todo lo referente a peticiones HTTP, autenticación y excepciones; será la clase que entré con contacto directo con el servicio. El resultado que devuelva TurpialHTTP es procesado dentro de la misma clase protocolo e incluso dentro del mismo método que ejecutó la petición, evitando tener que usar funciones fuera del hilo. Este resultado se devuelve a la API y ésta hace lo propio para actualizar los controles de la vista. Para una siguiente optimización se puede considerar usar el controlador como intermediario para actualizar la vista (como debe ser).
Para esta nueva implementación también se pretende usar una serie de objetos que ayuden a la unificación de los datos. Entre ellos un objeto Post que represente de forma unívoca un tweet y un objeto Response que permita representar un grupo de objetos Post (como respuesta a una petición) con un error o mensaje descriptivo. Más adelante estaré dando más información al respecto.
Disculpen si es un poco ofuscada la información, fue lo mejor que pude hacer para representar las ideas que tengo en mente :P
Es todo por ahora. Comentarios, preguntas y sugerencias bienvenidas