Android HttpClient:NetworkOnMainThreadException

Android HttpClient:NetworkOnMainThreadException,android,networkonmainthread,Android,Networkonmainthread,我有一些代码如下: protected void testConnection(String url) { DefaultHttpClient httpclient = new DefaultHttpClient(); HttpGet httpget = new HttpGet(url); ResponseHandler<String> responsehandler = new BasicResponseHandler(); try {

我有一些代码如下:

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();
}
受保护的void testConnection(字符串url){
DefaultHttpClient httpclient=新的DefaultHttpClient();
HttpGet HttpGet=新的HttpGet(url);
ResponseHandler ResponseHandler=新BasicResponseHandler();
试一试{
String connection=httpclient.execute(httpget,responsehandler);
Toast.makeText(getBaseContext(),R.string.connection_success,Toast.LENGTH_SHORT).show();
查看_result.setText(连接);
}捕获(IOE异常){
Toast.makeText(getBaseContext(),R.string.connection_失败,Toast.LENGTH_SHORT.show();
}
httpclient.getConnectionManager().shutdown();
}
并在Menifest中添加权限:

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

但有一个例外: NetworkOnMainThreadException,
如何操作?

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

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

可能的工具有Android的
AsyncTask
和普通的Java
线程


在这里可以找到一个很好的教程:

您不能在事件线程中执行网络操作,因为android Api级别为11。
相反,您应该在事件线程以外的另一个线程中执行网络操作,并使用Handler或Asynctask来执行此操作。

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

在UI线程之外运行此方法。例如,在AsyncTask Thread中,请查看我关于线程的帖子。它解释了可能发生这种情况的原因。的可能重复