【发布时间】:2015-10-03 14:51:16
【问题描述】:
在我的 Android 应用程序中,我有时会进行同步 HTTP 调用。由于这在主 UI 线程中是不可能的,因此我试图通过使用 com.loopj.android.http.AsyncHttpClient 和处理程序来规避问题。在我的代码中,我尝试等待调用完成:
public class someclass {
...
//asynchronous HTTP handler for Android
private static AsyncHttpClient httpClient = new AsyncHttpClient();
...
public void somemethod() {
...
httpClient.get(request, handler);
...
//waiting for call to be finished
do {
Thread.sleep(100); //for testing only
log.info("sleeping...");
} while (!handler.isFinished());
response = handler.getBody();
log.info("Async resp = " + response);
...
我编写了自己的处理程序类:
public class MyAsyncHTTPResponseHandler extends AsyncHttpResponseHandler {
private String header = null;
private String body = null;
private int status = 0;
boolean finish = false;
public MyAsyncHTTPResponseHandler() {
super();
log.info("init Http handler ");
finish = false;
}
@Override
public void onStart() {
// called before request is started
log.info("starting Async Get");
finish = false;
}
@Override
public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) {
body = new String(responseBody);
status = statusCode;
finish = true;
log.info("Async Get worked fine " + responseBody);
}
@Override
public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, java.lang.Throwable error) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
log.info("Error in executing URL get " + statusCode + " " + responseBody);
finish = true;
}
@Override
public void onRetry(int retryNo) {
// called when request is retried
}
public String getBody() {
return body;
}
public int getStatusCode() {
return status;
}
public boolean isFinished() {
return finish;
}
}
不幸的是,这不起作用。 onStart() 方法将被执行,但循环将永远运行。不会调用onSuccess() 方法。
如果我注释掉循环,正文响应将为空。正如我在这种情况下的日志中看到的那样,onSuccess() 方法将被调用,但在我在somemethod() 中的日志语句之后。
我在这里做错了什么?
【问题讨论】:
标签: java android multithreading user-interface http