0

我正在学习在 Android 中为我的应用程序进行 HTTP 客户端连接,但我遇到了问题。我在 New Boston letter for letter 上按照教程进行了操作,但它似乎仍然不起作用。我可以在设备顶部的状态栏中看到它正在获取数据,但没有任何返回。

理想情况下,此时我需要连接到服务器上的 api.php 文件并向其发送一个登录命令(然后使用登录命令返回的密钥发送一个 post 命令)。

我知道我必须构建一个 URI 才能传递给 HttpPost,但那时我迷路了……我运行的示例应用程序不会像教程中那样返回数据。

我已将清单设置为允许 INTERNET 访问。

这是教程中的代码(它使用 HttpGet,但一旦我弄清楚它为什么不起作用,我就可以翻译成 HttpPost)。

public String getInternetData() throws Exception {
    BufferedReader in = null;
    String data = "did this work";
    try {
        HttpClient client = new DefaultHttpClient();
        URI website = new URI("http://www.longship.ca");
        HttpGet request = new HttpGet();
        request.setURI(website);
        HttpResponse response = client.execute(request);
        in = new BufferedReader(new InputStreamReader(response.getEntity()
                .getContent()));
        StringBuffer sb = new StringBuffer("");
        String l = "";
        String nl = System.getProperty("line.separator");
        while ((l = in.readLine()) != null) {
            sb.append(l + nl);
        }
        in.close();
        data = sb.toString();
        return data;
    } finally {
        if (in != null) {
            try {
                in.close();
                return data;
            } catch (Exception e) {
                e.printStackTrace();

            }
        }

    }

}

我已经添加了主 java 文件中的代码,就像我在评论中所说的那样。被调用的类称为“GetMethodEx.java”。

公共类 HttpTest 扩展 Activity {

TextView tvResponse;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webtest);
    tvResponse = (TextView) findViewById(R.id.tvHttp);
    GetMethodEx gme = new GetMethodEx();
    String returned;
    try {
        tvResponse.setText("Getting Data");
        returned = gme.getInternetData();

        tvResponse.setText(returned);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.e("MyLogTag", "Exception in getInternetData", e);
    }

}

}

4

2 回答 2

0

您是否异步调用请求方法?您可以使用 Android AsyncTask。

于 2013-06-28T05:35:08.957 回答
0

你得到一个 android.os.NetworkOnMainThreadException,因为你在主线程上进行网络操作。您要么必须将此方法放入一个新线程中,要么将此代码分离到一个扩展 AsyncTask 的新类中。我建议使用AsyncTask

于 2013-06-28T06:35:08.213 回答