3

我在下面有一些代码:

protected void testConnection(String url) {
    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(url);
    ResponseHandler<String> responsehandler = new BasicResponseHandler();

    try {
        String connection = httpclient.execute(httpget, responsehandler);
        Toast.makeText(getBaseContext(), R.string.connection_succeed, Toast.LENGTH_SHORT).show();
        view_result.setText(connection);
    } catch(IOException e) {
        Toast.makeText(getBaseContext(), R.string.connection_failed, Toast.LENGTH_SHORT).show();
    }
    httpclient.getConnectionManager().shutdown();
}

并在 Menifest 中添加权限:

<uses-permission android:name="android.permission.INTERNET"/>

但它有一个例外:NetworkOnMainThreadException,我该怎么办?

4

4 回答 4

7

在 ICS 和更高版本上,您不能再在 UI 线程上执行网络操作。相反,你被迫创建一个新线程并在那里做你的网络工作。

可能的工具是 AndroidAsyncTask和普通的 Java Thread

可以在这里找到一个很好的教程:Android Threads, Handlers and AsyncTask - Tutorial

于 2012-07-31T09:01:48.053 回答
1

从 API 11 开始,您不能在主线程上操作网络(耗时)操作。使用AsyncTaskThread执行此类操作。

于 2012-07-31T09:01:21.583 回答
1

从 android Api Level 11 开始,您不能在事件线程中执行网络操作。相反,您应该在事件线程之外的另一个线程中执行网络操作,并使用 Handler 或 Asynctask 来执行此操作。

于 2012-07-31T09:02:39.887 回答
0

我在 android 2.x 及其较低版本中运行您的代码,我认为此代码将完美运行。但是如果你在 3.x 中运行它并且它是更高版本,那么你会得到一个异常。问题是您需要从工作线程(AsyncTask<>) 调用 Web 服务。您不能从主线程调用 Web 服务。

于 2012-10-25T10:10:25.217 回答