Estoy creando una aplicación de Android que tiene que ejecutar solicitudes web en segundo plano y luego manejar los datos recibidos y modificar la interfaz de usuario de acuerdo con la respuesta del servidor.¿Cómo ejecutar la solicitud web en su propio hilo?
El objetivo de publicar solicitudes y gestionar datos en segundo plano es evitar la congelación de la interfaz de usuario. Sin embargo, actualmente noto que la interfaz de usuario se está congelando, así que no estoy seguro de que la lógica funcione como debería.
Aquí es la parte del código que se supone para publicar las solicitudes y manejar las respuestas en su propio hilo y luego pasar los datos a GUI:
public class ServerConnection {
Queue<String> requests;
...
DefaultHttpClient httpClient;
HttpHost targetHost;
Handler handler;
ServerResponseHandler responseHandler;
Activity activity;
public ServerConnection(Activity activity){
this.activity = activity;
this.responseHandler = (ServerResponseHandler) activity;
httpClient = new DefaultHttpClient();
targetHost = new HttpHost(TARGET_DOMAIN, 80, "http");
requests = new LinkedList<String>();
}
private Runnable requestSender = new Runnable(){
@Override
public void run() {
if(!requests.isEmpty()){
String requestString = requests.remove();
HttpGet httpGet = new HttpGet(requestString);
httpGet.addHeader("Accept", "text/xml");
String encodingString = "testuser:testpass";
String sEncodedString = Base64Coder.encodeString(encodingString);
try{
String sContent = fetchURL(requestString, sEncodedString);
XMLParser xmlParser = new XMLParser();
List <Product> products = xmlParser.getProducts(sContent);
responseHandler.onProductsResponse(products);
}
catch(Exception ex){
Log.e(TAG, ex.getMessage());
}
}
}
};
public void sendRequest(String requestString){
requests.add(requestString);
handler = new Handler();
handler.post(requestSender);
}
El método sendRequest() se llama a partir de la actividad principal que implementa ServerResponseHandler. Supongo que la solicitud se ejecuta en su propio hilo y llamando al
responseHandler.onProductsResponse (productos);
la lista de productos (datos de la web) se pasa a la actividad principal. De todos modos, debido al bajo rendimiento, agradecería que alguien pudiera corregir cualquier posible problema en la lógica anterior o sugerir cualquier otra (mejor) opción.
Asynctask o controlador + hilo, depende de usted Niko – tbruyelle
AsyncTask es el camino a seguir. –
Son buenas soluciones – kablu