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中,请查看我关于线程的帖子。它解释了可能发生这种情况的原因。的可能重复