您的位置:首页 > 理论基础 > 计算机网络

如何解决安卓网络主线程异常的问题:Caused by: android.os.NetworkOnMainThreadException [duplicate]

2013-03-02 14:41 826 查看
原因:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 
1. 不要阻塞UI线程 
2. 确保只在UI线程中访问Android UI工具包 比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText()的.因为其他线程中是不能直接访问主UI线程成员


android提供了几种在其他线程中访问UI线程的方法。 

Activity.runOnUiThread( Runnable ) 

View.post( Runnable ) 

View.postDelayed( Runnable, long ) 

Hanlder 

这些类或方法同样会使你的代码很复杂很难理解。然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。 

     为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。 
两种方法:

1.不要把网络请求的代码写到Android主UI线程中(推荐写到Async Task异步处理类中去) 

Don't write network call in Main UI Thread, Use Async Task for that.

2.把下面的代码写到你的主程序文件中“setContentView(***)”之后 

Write
below code into your MainActivity file after setContentView(R.layout.activity_main);

代码:

if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}

原文:http://stackoverflow.com/questions/13136539/caused-by-android-os-networkonmainthreadexception
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐