引用原文:https://blog.csdn.net/llixiangjian/article/details/72910557
在测试网络链接状态的时候碰到一个异常:android.os.NetworkOnMainThreadException
第一次看到这异常,字面意思是说:在主线程中的网络异常。然后我就去了解了下这个异常,参考了CSDN博客:
一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。
以下为引用原文,已测试通过
解决方案有两个,一个是使用StrictMode,二是使用线程来操作网络请求。
第一种方法:简单暴力,强制使用,代码修改简单(但是非常不推荐)
在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码
-
if (android.os.Build.VERSION.SDK_INT > 9) {
-
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
-
StrictMode.setThreadPolicy(policy);
-
}
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
this.setContentView(R.layout.main_view);
-
new Thread(runnable).start();
-
}
-
-
Handler handler = new Handler(){
-
-
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(){
-
-
public void run() {
-
// TODO: http request.
-
Message msg = new Message();
-
Bundle data = new Bundle();
-
data.putString( "value", "请求结果");
-
msg.setData(data);
-
handler.sendMessage(msg);
-
}
-
}
-
// Android 4.0 之后不能在主线程中请求HTTP请求
-
new Thread( new Runnable(){
-
-
public void run() {
-
cachedImage = asyncImageLoader.loadDrawable(imageUrl, position);
-
imageView.setImageDrawable(cachedImage);
-
}
-
}).start();