安卓问题总结( 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(); } }
我是安卓新手,如果有不对的地方还请大家多多指导~
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。