我正在創建一個android應用程序,它必須在後臺執行web請求,然後處理接收到的數據並根據服務器響應修改用戶界面。如何在自己的線程中執行Web請求?
在後臺發佈請求和處理數據的目標是避免凍結用戶界面。但是目前我注意到用戶界面是凍結的,所以我不確定邏輯是否按照它應該的那樣工作。
這裏是這是應該發佈的請求,並在其自己的線程處理響應,然後將該數據傳遞給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);
}
方法sendRequest將()被從主活動稱爲其實現ServerResponseHandler。我猜這個請求是在它自己的線程中執行的,並且通過調用
responseHandler.onProductsResponse(products);
產品清單(來自網絡的數據)傳遞給主要活動。無論如何,由於表現不佳,如果有人能夠糾正上述邏輯中的任何可能的問題或建議任何其他(更好的)選項,我將不勝感激。
Asynctask或處理程序+線程,這取決於你Niko – tbruyelle
AsyncTask是要走的路。 –
這是很好的解決方案 – kablu