android.os.NetworkOnMainThreadException异常怎么解决
2013-05-06 12:02 张智清 阅读(5747) 评论(0) 编辑 收藏 举报很多教程上有关网络访问的代码,最简单的有类似这样的:
ImageView imgV = (ImageView) findViewById(R.id.imageView1); try { URL url = new URL("http://url地址"); InputStream is = url.openStream(); Bitmap bm = BitmapFactory.decodeStream(is); imgV.setImageBitmap(bm); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
但是就是这个如此简单的代码也可能让你折腾死,报android.os.NetworkOnMainThreadException异常无法运行。这个异常大概意思是在主线程访问网络时出的异常。 Android在4.0之前的版本支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了。
解决方法:多线程,异步加载的方式加载数据
具体方法就是各种多线程/异步的实现,如下述方法之一。
new Thread() { @Override public void run() { // 需要执行的方法 // 执行完毕后给handler发送一个空消息 handler.sendEmptyMessage(0); } }.start(); //定义Handler对象 private Handler handler = new Handler() { //当有消息发送出来的时候就执行Handler的这个方法来处理消息分发 @Override public void handleMessage(Message msg) { super.handleMessage(msg); //处理UI } };
也可以用AsyncTask来实现
class DownImage extends AsyncTask { private ImageView imageView; public DownImage(ImageView imageView) { //TODO Auto-generated method stub this.imageView = imageView; } @Override protected Bitmap doInBackground(String... params) { //TODO Auto-generated method stub String url = params[0]; Bitmap bitmap = null; try { InputStream is = new URL(url).openStream(); bitmap = BitmapFactory.decodeStream(is); } catch(Exception e) { e.printStackTrace(); } return bitmap; } @Override protected void onPostExecute(Bitmap result) { //TODO Auto-generated method stub imageView.setImageBitmap(result); } }
还有可以用StrictMode进行线程策略规划
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架