【发布时间】:2010-01-08 02:14:36
【问题描述】:
我正在创建一个 android 应用程序,它必须在后台执行 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);
产品列表(来自网络的数据)被传递给主要活动。无论如何,由于性能不佳,如果有人可以纠正上述逻辑中的任何可能问题或提出任何其他(更好的)选项,我将不胜感激。
【问题讨论】:
标签: java android multithreading