异步连接的返回值

时间:2015-11-13 11:48:15

标签: java android multithreading asynchronous

我遇到了关于如何返回异步连接值的问题。

我想要做的是创建一个函数(例如" getById"),它询问服务器并返回一个包含服务器答案的对象。

我尝试过许多不同的HTTP客户端,但我得到的只是创建局部变量/与UI交互的可能性,但不返回值。

几乎所有Http客户端中使用的主要架构是:创建请求,使用请求处理程序处理它,并将响应处理程序传递给它,以处理响应。

我发生的情况是,我无法从请求处理程序访问响应,也没有检测到请求何时完成以便与响应进行交互;另一方面,从响应处理程序中,我可以使用响应进行UI更改或将其存储在本地,但我无法将其作为函数结果返回给用户。

有没有办法避免这种行为,或绕过/破解它?

我主要尝试了4种方法:

  1. 使用期货& FutureTasks。问题:我只能在请求处理程序上调用它们,因此我无法检测到响应何时就绪,但只是在请求处理程序准备就绪时。
  2. 使用回调。问题:与Futures和FutureTasks相同。
  3. 使用while(true),检查响应是否准备就绪。虽然这在理论上可能有效,但实际上它会导致主线程上出现阻塞,因此应用程序会冻结,并且会永远停留在while(true),因为它无法执行解锁它的代码。 / LI>
  4. 使用多线程。这可以防止阻塞主线程,但问题是线程无法返回值,并且响应处理程序无法访问另一个线程上使用的锁(或者看起来如此),所以我&#39 ; m无法通知后台任务已完成。
  5. 有什么方法我没有考虑过,或者任何我可能没有错误实施的方法?

    一些示例代码;在此代码中,我使用了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;
    
    }
    

    此示例失败,因为该值在可用之前返回。

1 个答案:

答案 0 :(得分:1)

您是否尝试过asyncTask? 它用于在后台执行操作,避免UI冻结。 您需要扩展AsyncTask类,覆盖执行Http请求的doInBackground方法和onPostExecute方法来更新主线程上的UI。

看看here