在主线程中的网络异常
。一个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);
}
第二种方法就是我使用的方法也是我要推荐的方法,将请求网络资源的代码使用Thread去操作。在Runnable中做HTTP请求,不用阻塞UI线程。
public
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); } } |