Ich erstelle eine Android-Anwendung, die Webanfragen im Hintergrund ausführen und dann die empfangenen Daten bearbeiten und die Benutzeroberfläche entsprechend der Serverantwort ändern muss.Wie Webanforderung in einem eigenen Thread ausführen?
Das Ziel, Anfragen zu stellen und Daten im Hintergrund zu bearbeiten, besteht darin, das Einfrieren der Benutzeroberfläche zu vermeiden. Momentan merke ich jedoch, dass die Benutzeroberfläche friert, daher bin ich mir nicht sicher, ob die Logik so funktioniert, wie sie soll.
Hier ist der Teil des Codes, die Anforderungen schreiben sollte, und die Antworten in einem eigenen Thread zu verarbeiten und dann die Daten an GUI übergeben:
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);
}
Verfahren sendrequest() aus der Haupttätigkeit genannt wird, die implementiert ServerResponseHandler. Ich nehme an, die Anfrage wird in einem eigenen Thread ausgeführt und durch den Aufruf
responseHandler.onProductsResponse (Produkte);
Die Liste der Produkte (Daten aus dem Internet) wird an die Hauptaktivität übergeben. Aufgrund der schlechten Leistung würde ich mich freuen, wenn irgendjemand ein mögliches Problem in der obigen Logik korrigieren oder eine andere (bessere) Option vorschlagen könnte.
Asynctask oder Handler + Thread, es liegt an dir Niko – tbruyelle
AsyncTask ist der Weg zu gehen. –
Es sind nette Lösungen – kablu