Tôi đang tạo một ứng dụng Android để thực thi các yêu cầu web trong nền và sau đó xử lý dữ liệu đã nhận và sửa đổi giao diện người dùng theo phản hồi của máy chủ.Làm thế nào để thực thi yêu cầu web theo chủ đề của riêng nó?
Mục tiêu của việc gửi yêu cầu và xử lý dữ liệu trong nền là để tránh việc đóng băng giao diện người dùng. Hiện tại tuy nhiên tôi nhận thấy rằng giao diện người dùng đang đóng băng vì vậy tôi không chắc chắn logic đang hoạt động như nó được cho là.
Dưới đây là phần mã mà là vụ phải gửi yêu cầu và xử lý phản hồi trong chủ đề riêng của mình và sau đó vượt qua các dữ liệu vào 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);
}
Phương pháp sendRequest() được gọi từ các hoạt động chính mà triển khai ServerResponseHandler. Tôi đoán yêu cầu được thực hiện theo chủ đề của riêng nó và bằng cách gọi
responseHandler.onProductsResponse (sản phẩm);
danh sách sản phẩm (dữ liệu từ web) được chuyển đến hoạt động chính. Dù sao do hiệu suất kém tôi sẽ đánh giá cao nếu có ai có thể sửa bất kỳ vấn đề có thể trong logic ở trên hoặc đề nghị bất kỳ khác (tốt hơn) tùy chọn.
Asynctask hoặc handler + thread, tùy thuộc vào bạn Niko – tbruyelle
AsyncTask là cách để thực hiện. –
Đó là giải pháp tốt đẹp – kablu