Comment exécuter une requête web dans son propre thread?
Je suis entrain de créer une application android qui a pour exécuter les requêtes web en arrière-plan et de gérer les données reçues et de modifier l'interface utilisateur en fonction de la réponse du serveur.
L'objectif de la publication des demandes et de traitement des données en arrière-plan est pour éviter le gel de l'interface utilisateur. Actuellement, cependant j'ai remarqué que l'interface utilisateur est le gel donc je ne suis pas sûr de la logique fonctionne comme il est censé le faire.
Voici la partie de code qui est censé publier des demandes et traiter les réponses dans son propre thread, puis transmettre les données pour l'interface utilisateur:
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);
}
La méthode sendRequest() est appelée à partir de l'activité principale, qui met en œuvre ServerResponseHandler. Je suppose que la requête est exécutée dans son propre thread, et en appelant
responseHandler.onProductsResponse(produits);
la liste des produits (données à partir du web) est passé à l'activité principale. De toute façon en raison de mauvaises performances, je serais reconnaissant si quelqu'un pouvait corriger tout problème possible dans la logique ci-dessus ou suggérer une autre (mieux) option.
source d'informationauteur Niko Gamulin
Vous devez vous connecter pour publier un commentaire.
Je vous suggère de prendre un coup d'oeil à La classe ASyncTask (disponible depuis Android 1.5).
Il simplifie le processus de création d'un Thread d'arrière-plan qui se synchronise avec le thread GUI une fois qu'il est complet.
Vous devriez être en mesure de réaliser ce que vous essayez à l'aide de code quelque chose de cette liste
Et exécuter en appelant
Selon la gestionnaire javadocje ne pense pas que le
post()
la méthode de créer des filets. Si je suis à droite exécuter laRunnable
sur le thread pour lequel le gestionnaire est attaché. Donc dans ce cas c'est l'activité de filetage de sorte que le thread de l'INTERFACE utilisateur ! C'est pourquoi vous avez de mauvaises performances.Vous avez à mettre en œuvre un
Thread
qui exécuter votreRunnable
. Mais en faisant cela, vous ne serez pas en mesure de mettre à jour votre activité comme vous le font actuellement en appelant le :C'est parce que vous n'êtes plus dans le thread de l'INTERFACE utilisateur, et seul le thread d'INTERFACE utilisateur est autorisé à interagir avec l'INTERFACE utilisateur de (l'activité).
Donc, vous avez à remplacer cet appel en accédant à votre
Handler
.Et la mise en œuvre de la
handleMessage()
méthode pour votreHandler
:Dernier mais non le moindre : le
Handler
doit encore être créée dans l'activité de filetage.