问题描述:
android.os.NetworkOnMainThreadException异常(不要在主线程访问网络资源)
问题分析:
造成这种异常的原因是安卓版本问题(仔细研究错误原因是代码不符合Android规范),网上搜索发现:android3.0版本开始(具体是不是从这个版本开始的,就不深究咯)就强制程序不能在主线程中访问网络,要把访问网络放在独立的线程中。
解决方式:
1、想要忽略这些强制策略问题的话,可以在onCreate()方法里面加上
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
2、放在单独的线程中:(我用的是点击按钮查看网络图片,学习用)
private final class ButtonListenerEvent implements OnClickListener{
@Override
public void onClick(View v) {
final String path = imagePath.getText().toString();
final Handler handler = new Handler(){
public void handleMessage(Message msg){
switch (msg.what) {
case 0:
imageView.setImageBitmap(bitmap);
break;
default:
break;
}
}
};
new Thread(){
public void run(){
try {
byte[] data = ImageService.getImage(path);
// 设置图像的位图
bitmap = BitmapFactory.decodeByteArray(data, 0,
data.length);
//处理完发送一个空消息
handler.sendEmptyMessage(0);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(getApplicationContext(), R.string.error, 1)
.show();
}
}
}.start();
}
}