我遇到了关于如何返回异步连接值的问题。
我想要做的是创建一个函数(例如" getById"),它询问服务器并返回一个包含服务器答案的对象。
我尝试过许多不同的HTTP客户端,但我得到的只是创建局部变量/与UI交互的可能性,但不返回值。
几乎所有Http客户端中使用的主要架构是:创建请求,使用请求处理程序处理它,并将响应处理程序传递给它,以处理响应。
我发生的情况是,我无法从请求处理程序访问响应,也没有检测到请求何时完成以便与响应进行交互;另一方面,从响应处理程序中,我可以使用响应进行UI更改或将其存储在本地,但我无法将其作为函数结果返回给用户。
有没有办法避免这种行为,或绕过/破解它?
我主要尝试了4种方法:
有什么方法我没有考虑过,或者任何我可能没有错误实施的方法?
一些示例代码;在此代码中,我使用了Loopj的Android-Async-Http客户端,可用here:
public JSONObject getById(String url, String id) {
JSONObject jo = null;
AsyncHttpClient client = new AsyncHttpClient();
final AsyncHttpResponseHandler ahrh = new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
try {
jo = new JSONObject(new String(responseBody, "UTF-8"));
} catch (JSONException | UnsupportedEncodingException e) {
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
};
client.get(url + id, ahrh);
return jo;
}
此示例失败,因为该值在可用之前返回。
答案 0 :(得分:1)
您是否尝试过asyncTask?
它用于在后台执行操作,避免UI冻结。
您需要扩展AsyncTask类,覆盖执行Http请求的doInBackground
方法和onPostExecute
方法来更新主线程上的UI。
看看here