0

我正在 Android Studio 中学习 android 开发。我使用 Android-query 库进行简单的 HTTP 调用,以从我的 Grails Web 应用程序中获取 JSON 数据。在我的 android UI 中,我有一个按钮和一个 editText。我希望在单击按钮后显示从服务器返回的 JSON 字符串。这是代码:

public static class PlaceholderFragment extends Fragment {
    private AQuery aq;

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        aq = new AQuery(getActivity(), rootView);
        aq.id(R.id.button1).clicked(this, "onButtonClick");
        return rootView;
    }

    public void onButtonClick(View view) {
        String url = "http://localhost:8090/MyProject/main/index";
        aq.ajax(url, JSONObject.class, this, "jsonCallback");

    }

    public void jsonCallback(String url, JSONObject json, AjaxStatus status){
        if(json != null){
            aq.id(R.id.editText).text(json.toString());
        }else{
            aq.id(R.id.editText).text(status.getMessage());
        }
    }
}

在 Grails 方面,我只是直接发回一个 json 对象:

class MainController {
    def re = ['name' : 'abc']

    def index() {
        render re as JSON
    }
}

我可以在浏览器中访问我的 Grails 网址并获取正确的 JSON 数据:

{
    name: "abc"
}

如果我在虚拟设备中运行 android 应用程序,我只会收到“网络错误”消息。返回的 JSON 对象为空。

如果我使用相同的 android 代码访问http://ip.jsontest.com来代替我的 Grails 网址。我可以在没有网络错误的情况下返回正确的 json 数据。为什么?

谁能给我一些建议让 Android-query 与 Grails web 一起工作?

4

2 回答 2

0

如果您使用的是 Genymotion Android 模拟器,那么 URL 应该类似于“//192.168.56.1:8090/MyProject/main/index”,这是您的本地 IP 地址,或者如果您使用的是默认模拟器,那么应​​该类似于“// 10.0.0.2:8090/MyProject/main/index"

于 2014-12-03T05:46:33.327 回答
0

最后,我找到了原因:

要从 Android Emulator 访问 PC 上的本地主机 Web 应用程序,我们不能使用 localhost 作为服务器地址。我将 URL 更改为“http://10.0.3.2:8090/MyProject/main/index”(我使用 Genymotion Android 模拟器),它可以工作。

于 2013-10-30T04:15:25.627 回答