在android开发过程中,网络问题是避免不了的,NetworkOnMainThreadException 是我们常见问题,以上是怎么解决问题
#情景重现#
button.setOnClickListener(){
(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
String url = "http://www.baidu.com";
String json = get(url,""utf-8);
System.out.println("----------获取json:-----------"+json);}
}catch (Exception e) {
e.printStackTrace();
}
}
}
// 链接服务器
public static String get(String urlStr, String charsetName) throws Exception {
// 创建URL对象
URL url = new URL(urlStr);
// 打开链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 请求方式
conn.setRequestMethod(METHOD_GET);
//设置信息头属性
conn.setRequestProperty("User-Agent","iss");
// 超时时间
conn.setConnectTimeout(30000);
String result = "";
if (conn.getResponseCode() == 200) {
InputStream inputStream = conn.getInputStream();
byte[] data = StreamUtil.readByteArray(inputStream);
result = new String(data, charsetName);
}
System.out.println("-----------------get------------------");
return result;
}
这样运行的话,是访问不了网络的。结果:出现
android.os.NetworkOnMainThreadException
**错误提示的原因,不会停止运行,但是访问不了网络
Paste_Image.png**原因:不允许在主线程中进行网络访问
**解决的一种方法:利用异步加载类AsyncTask类
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PersonTask task = new PersonTask();
task.execute();
}
});
public class PersonTask extends AsyncTask<Void, Void, ArrayList<PersonLisInfo>> {
@Override
protected ArrayList<PersonLisInfo> doInBackground(Void... params) {
try {
String url = "http://www.baidu.com";
String json = get(url,""utf-8);
System.out.println("---------------HttpUtil------------------");
System.out.println("查询结果。。。。。。" + json);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
**
**运行结果:
成功获取到数据!!!
网友评论