首页 > 代码库 > 安卓问题总结( android.os.NetworkOnMainThreadException异常)
安卓问题总结( android.os.NetworkOnMainThreadException异常)
问题描述:
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 Bitmap bitmap = null;//全局变量 (我如果放在局部变量中,会提示:不可变的局部变量不能被赋值,懒省事就放到全局变量中咯)
按钮监听器:
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(); } }
我是安卓新手,如果有不对的地方还请大家多多指导~
安卓问题总结( android.os.NetworkOnMainThreadException异常)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。