oxot
25/03/15, 11:06:35
Buenos días,
estoy programando un app que hace una serie de consultas REST para lo que he decido usar la librería loopj (loopj.com/android-async-http/) para que se encargue de manejar todas las tareas asíncronas.
Entonces, tengo una activity contenera, un fragment que tiene una lista y otra clase que me guarda todas las consultas REST.
Mi problema es el siguiente:
Cuando realizas cualquier consulta, por ejemplo un get, lo haces por ejemplo con:
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
// called when response HTTP status is "200 OK"
}
override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
});
y como véis se utilizan clases internas anónimas como manejadores. El problema es que en onSuccess yo quiero actualizar una lista externa (que tengo en la clase fragment) pero Java protesta porque desde clases internas anónimas sólo puede manejar variables de método 'final' o variables de clase (que serían de la clase dónde están las consultas REST).
El problema es que no puedes hacer un método en plan
public Lista miMetodo(){
hazLaConsultaGet();
return laLista;
}
porque la consulta es asíncrona y entiendo que el método no espera a que retorne la consulta sino que devolverá una lista inválida.
Tampoco puedo hacer un return en onSuccess porque tengo que sobreescribir el método de clase y es de tipo void (menudo tela porque en asynctask esto te soluciona el problema).
Yo sólo veo dos soluciones pero me gustaría que gente que sabe de Java más que yo me contase si hay algún procedimiento estándar para estas situaciones:
1.- Usar listeners que implemento en la clase en la que tengo la lista.
2.- Hacer el handler no anónimo instanciándolo antes de la consulta (aunque no estoy seguro que esto resolviese el problema)
A ver si alguien se anima a darme ideas.
:gracias:
PS. Espero haber explicado claramente cómo va el tema. Es un poco lioso pero lo he tratado de simplificarlo.
estoy programando un app que hace una serie de consultas REST para lo que he decido usar la librería loopj (loopj.com/android-async-http/) para que se encargue de manejar todas las tareas asíncronas.
Entonces, tengo una activity contenera, un fragment que tiene una lista y otra clase que me guarda todas las consultas REST.
Mi problema es el siguiente:
Cuando realizas cualquier consulta, por ejemplo un get, lo haces por ejemplo con:
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
override
public void onSuccess(int statusCode, Header[] headers, byte[] response) {
// called when response HTTP status is "200 OK"
}
override
public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
}
});
y como véis se utilizan clases internas anónimas como manejadores. El problema es que en onSuccess yo quiero actualizar una lista externa (que tengo en la clase fragment) pero Java protesta porque desde clases internas anónimas sólo puede manejar variables de método 'final' o variables de clase (que serían de la clase dónde están las consultas REST).
El problema es que no puedes hacer un método en plan
public Lista miMetodo(){
hazLaConsultaGet();
return laLista;
}
porque la consulta es asíncrona y entiendo que el método no espera a que retorne la consulta sino que devolverá una lista inválida.
Tampoco puedo hacer un return en onSuccess porque tengo que sobreescribir el método de clase y es de tipo void (menudo tela porque en asynctask esto te soluciona el problema).
Yo sólo veo dos soluciones pero me gustaría que gente que sabe de Java más que yo me contase si hay algún procedimiento estándar para estas situaciones:
1.- Usar listeners que implemento en la clase en la que tengo la lista.
2.- Hacer el handler no anónimo instanciándolo antes de la consulta (aunque no estoy seguro que esto resolviese el problema)
A ver si alguien se anima a darme ideas.
:gracias:
PS. Espero haber explicado claramente cómo va el tema. Es un poco lioso pero lo he tratado de simplificarlo.