一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。
解决方案有两个,一个是使用StrictMode,二是使用线程来操作网络请求。
第一种方法:简单暴力,强制使用,代码修改简单(但是非常不推荐) 在MainActivity文件的setContentView(R.layout.activity_main)下面加上如下代码
1
2
3
4
|
if (android.os.Build.VERSION.SDK_INT > 9 ) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
} |
第二种方法就是我使用的方法也是我要推荐的方法,将请求网络资源的代码使用Thread去操作。在Runnable中做HTTP请求,不用阻塞UI线程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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);
}
} |
上面是比较通用的方法,我的代码:
1
2
3
4
5
6
7
8
|
// Android 4.0 之后不能在主线程中请求HTTP请求 new Thread( new Runnable(){
@Override
public void run() {
cachedImage = asyncImageLoader.loadDrawable(imageUrl, position);
imageView.setImageDrawable(cachedImage);
}
}).start();
|