Android异常 java.lang.IllegalStateException解决方法
Android异常详情介绍
这种异常我遇到以下两种情况:
1.java.lang.IllegalStateException:Nowrappedconnection.
2.java.lang.IllegalStateException:Adapterisdetached.
原因:
1.单线程一次执行一个请求可以正常执行,如果使用多线程,同时执行多个请求时就会出现连接超时.
2.HttpConnection没有连接池的概念,多少次请求就会建立多少个IO,在访问量巨大的情况下服务器的IO可能会耗尽。
3.通常是因为HttpClient访问单一实例的不同的线程或未关闭InputStream的httpresponse。
解决方案:获得httpclient线程安全
解决前代码:
publicHttpClienthttpClient=newDefaultHttpClient(); publicvoidpostNoResult(finalContextcontext,finalStringurl,finalMap<String,String>maps,finalStringshow){ newThread(){ @Override publicvoidrun(){ try{ HttpPostpost=newHttpPost(url); List<NameValuePair>params=newArrayList<NameValuePair>(); for(Stringkey:maps.keySet()){ params.add(newBasicNameValuePair(key,maps.get(key))); } post.setEntity(newUrlEncodedFormEntity(params,HTTP.UTF_8)); HttpResponseresponse=httpClient.execute(post);//报错位置 if(response.getStatusLine().getStatusCode()==200){ Looper.prepare(); Stringr=EntityUtils.toString(response.getEntity()); ToastUtil.print_log(r); if(show!=null){ ToastUtil.show(context,show); } Looper.loop();} }catch(UnsupportedEncodingExceptione){ e.printStackTrace(); }catch(ClientProtocolExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }}}.start(); }
解决后代码:
publicHttpClienthttpClient=getThreadSafeClient();//获得httpclient线程安全。 publicstaticDefaultHttpClientgetThreadSafeClient(){ //获得httpclient线程安全的方法 DefaultHttpClientclient=newDefaultHttpClient(); ClientConnectionManagermgr=client.getConnectionManager(); HttpParamsparams=client.getParams(); client=newDefaultHttpClient(newThreadSafeClientConnManager(params, mgr.getSchemeRegistry()),params); returnclient; } publicvoidpostNoResult(finalContextcontext,finalStringurl,finalMap<String,String>maps,finalStringshow){ newThread(){ @Override publicvoidrun(){ try{ HttpPostpost=newHttpPost(url); List<NameValuePair>params=newArrayList<NameValuePair>(); for(Stringkey:maps.keySet()){ params.add(newBasicNameValuePair(key,maps.get(key))); } post.setEntity(newUrlEncodedFormEntity(params,HTTP.UTF_8)); HttpResponseresponse=httpClient.execute(post);//报错位置 if(response.getStatusLine().getStatusCode()==200){ Looper.prepare(); Stringr=EntityUtils.toString(response.getEntity()); ToastUtil.print_log(r); if(show!=null){ ToastUtil.show(context,show); } Looper.loop();} }catch(UnsupportedEncodingExceptione){ e.printStackTrace(); }catch(ClientProtocolExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }}}.start(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。