在开发使用网络连接的android应用时,遇到这么一个问题,只要一连接网络就报下面这个异常
android.os.NetworkOnMainThreadException
查了下API和源码,发现原来在4.0之后,使用网络时都会用到
StrictMode
中 AndroidBlockGuardPolicy的检查策略,如果在UI线程连接网络就会报这个异常,尝试了一下把AndroidMainfest中android:targetSdkVersion="15"去掉或者更换成更低的版本,这个异常就不会报了。最根本的解决办法是把这些网络操作放到非UI线程去执行。
在API文档中这一点也有了说明,这样也好,避免我们把耗时的网络操作放到UI线程中去执行,提高应用的用户体验。
在此记一下,免得以后忘记,也分享出来,希望朋友们不会再范同样的错误了。
API说明贴出来:
The exception that is thrown when an application attempts to perform a networking operation on its main thread.
This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged.
- 大小: 89.9 KB
分享到:
相关推荐
在Android开发中,`Caused by: android.os.NetworkOnMainThreadException` 是一个常见的错误,它意味着开发者尝试在主线程(UI线程)中执行网络操作,这是被禁止的。自Android 4.0 (API Level 14)以后,为了保证用户...
当开发者违反这一规则时,系统会抛出`Android.os.NetworkOnMainThreadException`,提示主线程异常。 针对这个问题,Android提供了一些解决方案来确保网络请求等耗时操作不在主线程中执行。以下是几种常见的处理方式...
1. **UI线程不能被阻塞**:所有与UI相关的操作必须在UI线程中执行,否则会抛出`android.os.NetworkOnMainThreadException`等异常。为了避免阻塞UI线程,长耗时的操作如网络请求、数据库操作应放在子线程中执行。 2. ...
本文将深入探讨如何处理“android.os.NetworkOnMainThreadException”这一常见的异常,该异常通常发生在尝试在网络主线程上执行网络操作时。理解这个问题并找到解决方案对于优化应用性能和提升用户体验至关重要。 ...
- 在异步操作中创建`AlertDialog`时,需确保操作在UI线程执行,否则会抛出`android.os.NetworkOnMainThreadException`异常。 9. **Material Design兼容** - 对于Android 5.0(API级别21)及以上版本,`...
请确保在UI线程中执行这些操作,否则可能会抛出 `android.os.NetworkOnMainThreadException` 异常。可以使用 `runOnUiThread` 或 `Handler` 来更新UI: ```java @Override public void onTick(long ...
例如,当一个服务或者后台线程需要更新UI时,它可以通过`Handler`将更新操作的消息发送到UI线程,确保不会抛出`android.os.NetworkOnMainThreadException`等异常。 7. **生命周期管理**: 当不再需要使用`Handler`...
这意味着,如果你在子线程中尝试修改任何UI元素,如文本、图片或者布局,系统会抛出`android.os.NetworkOnMainThreadException`异常,提示你在子线程中进行了网络操作或者UI更新。因此,要在子线程中更新主线程的...
- 在更新UI时,确保始终在主线程进行,以免抛出`android.os.NetworkOnMainThreadException`异常。 - 管理好生命周期,避免内存泄漏和资源浪费。 - 使用适当的缓存策略,减少不必要的网络请求或数据库查询。 通过...
- 不要在非UI线程中直接更新UI,否则会导致`android.os.NetworkOnMainThreadException`等错误。 - 使用`Looper.quit()`或`Looper.quitSafely()`可以结束`Looper`的消息循环,但需谨慎操作,因为这可能会影响到其他...
在实际应用中,显示传感器信息通常涉及到更新UI,这可能需要用到线程同步技术,比如`runOnUiThread()`或使用`Handler`,因为直接在主线程外修改UI可能会导致`android.os.NetworkOnMainThreadException`异常。...
- `Toast`需要运行在主线程中,否则会抛出`android.os.NetworkOnMainThreadException`异常。 - 每次调用`show()`方法,都会重新启动`Toast`的显示计时器,因此连续调用可能导致`Toast`显示时间延长。 - `Toast`在...
如果其他线程尝试更新UI,Android会抛出`android.os.NetworkOnMainThreadException`或`android.view.ViewRootImpl$CalledFromWrongThreadException`异常,提示开发者必须在正确的线程中执行这些操作。 源码分析是...
如果在其他线程中修改UI元素,会抛出`android.os.NetworkOnMainThreadException`异常。因此,我们需要使用异步处理或者Handler、Runnable、AsyncTask等工具来处理后台任务,然后在主线程中更新UI。 1. **Handler和...
但这里有一个问题,Android不允许在非主线程中直接修改UI,因此这段代码会抛出`android.os.NetworkOnMainThreadException`异常,导致程序崩溃。 正确的做法是使用Handler来处理子线程与主线程的通信。Handler通常...
4. 避免在`doInBackground()`中执行与UI相关的操作,这可能导致`android.os.NetworkOnMainThreadException`异常。 5. 对于大文件或大量数据,考虑使用流式解析(如`JsonReader`),以节省内存并提高性能。 总之,...
任何对UI的操作都必须在这个线程中进行,否则会抛出`android.os.NetworkOnMainThreadException`等异常。因此,当需要执行网络请求、数据库操作或大计算量的任务时,我们需要在其他线程(非UI线程)中执行。 接着,...
- 在处理用户交互(如点击按钮)时,通常需要在UI线程中进行,否则可能会抛出`android.os.NetworkOnMainThreadException`异常。 - 如果需要在视频播放完成后执行某些操作,可以监听`OnCompletionListener`事件。 ...