安卓HttpClient:NetworkOnMainThreadException

4

我有以下代码:

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();
}

并在Manifest中添加权限:

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

但是它抛出了一个异常: NetworkOnMainThreadException, 我该怎么办?


不要在UI线程中运行此方法。例如,在AsyncTask或线程中运行。 - Georgy Gobozov
看看我的关于 NetworkOnMainThreadException 的帖子吧。它解释了为什么会发生这种情况。 - Alex Lockwood
1
可能是android.os.NetworkOnMainThreadException的重复问题。 - laalto
4个回答

7

从ICS版本(Android 4.0)开始,您不能再在UI线程上执行网络操作。相反,您需要创建一个新的线程,在那里完成您的网络操作。

可能用到的工具有Android的AsyncTask和普通的Java Thread

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


1

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


1

在Android API Level 11及以上版本中,您不能在事件线程中执行网络操作。

相反,您应该在另一个线程中执行网络操作,使用Handler或Asynctask来完成。


0
如果您在Android 2.x及其以下版本中运行代码,我认为此代码将完美运行。但是,如果您在3.x及其更高版本中运行此代码,则会出现异常。问题在于您需要从工作线程(AsyncTask<>)调用Web服务。您不能从主线程调用Web服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接