android 4.0 项目 在activity里请求网络报错: android.os.NetworkOnMainThreadException
刚遇到一个蛋疼问题,我们做的项目是4.0的,在activity里http请求网络,结果总是报错:android.os.NetworkOnMainThreadException。 但是把这段请求网络代码,单独提炼出来测试又是正常的,请求网络代码如下:
/**
* 封装客户端向服务器端发送信息的函数,并且返回一个服务器端返回给客户端的一个结果
* @param params填写url的参数
* @param encode
* 字节编码
* @return
*/
public static String sendPostMessage(Map<String, String> params,
String encode) {
// 作为StringBuffer的初始字符串
StringBuffer buffer = new StringBuffer();
//buffer.append("?");
// 把map集中的参数取出并编码拼接在path上
try {
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
buffer.append(entry.getKey())
.append("=")
.append(entry.getValue())//URLEncoder.encode(entry.getValue(), encode)
.append("&");
}
}
// 移除最后一个符号
buffer.deleteCharAt(buffer.length() - 1);
//buffer.replace(buffer.length()-1, buffer.length(), buffer.toString());
// 使用http协议
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
// 设置请求超时的时间
httpURLConnection.setConnectTimeout(3000);
// 打开输入流通道向服务器获取数据
httpURLConnection.setDoInput(true);
// 打开输出流通道,向服务器写数据
httpURLConnection.setDoOutput(true);
// 获取上传数据的字节大小以及长度
//buffer=buffer.substring(0, buffer.length()-1);
System.out.println("buffer1--" + buffer.toString());
byte[] mydata = buffer.toString().getBytes();
// url请求内容封装到请求体中
// 设置请求体的属性
httpURLConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
// 设置请求体的长度
httpURLConnection.setRequestProperty("Content-Length",
String.valueOf(mydata.length));
// 获得输出流像服务器输出数据
OutputStream os = httpURLConnection.getOutputStream();
os.write(mydata);
// 获得服务器响应的结果和状态码
int rsponseCode = httpURLConnection.getResponseCode();
if (rsponseCode == 200) {
// 把一个输入流变成一个字符串
//这段代码就是为了服务器返回数据,在客户端显示
return changeInputStream(httpURLConnection
.getInputStream(),encode);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
public static String getStr(){
String str1="";
try {
str1 = changeInputStream(getInputStream(), "utf-8");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str1;
}
/**
*把一个输入流变成一个字符串
* @param inputStream
* @return
*/
private static String changeInputStream(InputStream inputStream,String encode) {
// TODO Auto-generated method stub
//先把流写入内存中
ByteArrayOutputStream bos=new ByteArrayOutputStream();
byte[] data=new byte[1024];
int len=0;
String result="";
if(inputStream!=null){
try {
while ((len=inputStream.read(data))!=-1) {
bos.write(data, 0, len);
}
result=new String(bos.toByteArray(), encode);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
这里请求网络使用“post”方式请求,其原理都是操作流。经过反复折腾,我认为是线程问题,于是我又在activity里单开了一个线程,在新线程里访问网络,但是还是不行。最终只好到google找答案。功夫不负有心人。找到了解决方案,在Oncreate里加上这段代码:
一:在发起Http请求的Activity里面的onCreate函数里面添加如下代码:
//详见StrictMode文档 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
其原因就是因为4.0系统访问网络不能在主程序中进行。
posted on 2013-08-03 09:23 just__chao 阅读(834) 评论(0) 编辑 收藏 举报