02-10 10:46:23.099: W/System.err(2319): android.os.NetworkOnMainThreadException
-
解决方案有两个,一个是使用StrictMode,二是使用线程来操作网络请求。
第一种方法:简单暴力,强制使用,代码修改简单(但是非常不推荐)
在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码1234if
(android.os.Build.VERSION.SDK_INT >
9
) {
StrictMode.ThreadPolicy policy =
new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
第二种方法就是我使用的方法也是我要推荐的方法,将请求网络资源的代码使用Thread去操作。在Runnable中做HTTP请求,不用阻塞UI线程。123456789101112131415161718192021222324252627public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
this
.setContentView(R.layout.main_view);
new
Thread(runnable).start();
}
Handler handler =
new
Handler(){
@Override
public
void
handleMessage(Message msg) {
super
.handleMessage(msg);
Bundle data = msg.getData();
String val = data.getString(
"value"
);
Log.i(TAG,
"请求结果:"
+ val);
}
}
Runnable runnable =
new
Runnable(){
@Override
public
void
run() {
// TODO: http request.
Message msg =
new
Message();
Bundle data =
new
Bundle();
data.putString(
"value"
,
"请求结果"
);
msg.setData(data);
handler.sendMessage(msg);
}
}
上面是比较通用的方法,我的代码:12345678// Android 4.0 之后不能在主线程中请求HTTP请求
new
Thread(
new
Runnable(){
boolean flag = HttpUtils.getLoginFlag(sno,pwd);
Message msg =handler.obtainMessage();
util.showLoading();
if(flag){
//登录成功,将用户的学号保存起来;
DataUtils.SNO = sno;
msg.what=LOGIN_SUCCESS;
handler.sendMessage(msg);
}
else{
msg.what = LOGIN_FAIl;
handler.sendMessage(msg);
}
}
}).run();