0

我正在使用 ASyncHttpClient 及其工作进行简单的“获取”,并在 onSuccess() 函数中为我提供正确的 json 响应,但是当我尝试将字符串响应保存到变量并在函数中返回该变量时,它总是返回一个空字符串。

代码:

public class HttpRequests 
{   
    public String jsonString = "";

    public String add_guest(String name, String id, String hardware_id) 
    { 
        AsyncHttpClient client = new AsyncHttpClient();
        String url = "http://www.mysite.com/api.php?name="+name+"&id="+id+"&hardware_id="+hardware_id;

        client.get(url, new JsonHttpResponseHandler() 
        {
            @Override
            public void onSuccess(JSONObject response)
            {
                jsonString = response.toString();
            //this successfully ouputs the json response in LogCat
                Log.d("response:",jsonString);
            }

            @Override
            public void onFailure(Throwable e) 
            {
                Log.d("http error:",e.toString());
            }
        });
        //this returns ""
        return jsonString;
    }
}

好像 onSuccess 中的 jsonString 与我返回的 jsonString 不在同一范围内。这背后的原因是我有很多 api 调用并希望将它们全部保存在同一个类中,然后在我需要它们时从其他各种类调用它们并从那里解析 json。我也尝试返回 json 对象而不是字符串,但与此相同..它只是从另一个类中出现空白。(它没有在 onSuccess 中正确设置)

有任何想法吗..?

编辑:

对不起,我应该澄清一下。我正在从我的其他班级打电话给 add_guest。这是来自我的另一堂课:

String response = "";
HttpRequests myRequest = new HttpRequests();
response = myRequest.add_guest("bob","1","123");

现在通过调用 add_guest 这应该反过来调用 JsonHttpResponseHandler 它“应该”将 jsonString 设置为响应并返回它..除非我错过了一些东西..

4

1 回答 1

3

让我们仔细看看你的代码:

public class HttpRequests 
{   
    public String jsonString = "";

这声明了一个名为的成员变量并将jsonString其初始化为一个空字符串。

    public String add_guest(String name, String id, String hardware_id) 
    { 
        AsyncHttpClient client = new AsyncHttpClient();
        String url = "http://www.mysite.com/api.php?name="+name+"&id="+id+"&hardware_id="+hardware_id;

        client.get(url, new JsonHttpResponseHandler() 

这将创建一个JsonHttpResponseHandler对象,当响应可用时将调用该对象。请注意,尚未执行此处理程序中的任何代码。仅创建对象。

        {
            @Override
            public void onSuccess(JSONObject response)
            {
                jsonString = response.toString();
            //this successfully ouputs the json response in LogCat
                Log.d("response:",jsonString);
            }

            @Override
            public void onFailure(Throwable e) 
            {
                Log.d("http error:",e.toString());
            }
        });
        //this returns ""
        return jsonString;

正如您的评论所述,这会返回,""因为没有执行任何处理程序代码。在处理程序完成后,您需要找到一种方法给调用者字符串。

    }
}

进一步的建议:

在看到调用的代码之后add_guest(),想到的一个可能的解决方案是更改add_guest()为 return并在调用中void添加另一个方法。该方法可以等待响应然后返回。为此,您可能需要声明为成员变量,而不是本地到. 我对这个类不熟悉,但我怀疑它有一个方法会阻塞,直到发生响应。HttpRequestsgetResponse()jsonStringAsyncHttpClient clientadd_guest()AsyncHttpClient

另一种可能的解决方案是添加一个HttpRequests(JsonHttpResponseHandler)构造函数。然后调用的类就add_guest()可以实现JsonHttpResponseHandler(假设是接口,不是抽象类),直接得到响应。

于 2013-01-25T02:27:26.370 回答