`
翻晒时光
  • 浏览: 9306 次
文章分类
社区版块
存档分类
最新评论

Android之NetworkOnMainThreadException异常

阅读更多

看名字就应该知道,是网络请求在MainThread中产生的异常

 

先来看一下官网的解释:

 

Class Overview

 

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. See the document Designing for Responsiveness.

Also see StrictMode.

http://developer.android.com/intl/zh-cn/reference/android/os/NetworkOnMainThreadException.html

 

解释一下,从Honeycomb SDK(3.0)开始,google不再允许网络请求(HTTP、Socket)等相关操作直接在Main Thread类中,其实本来就不应该这样做,直接在UI线程进行网络操作,会阻塞UI、用户体验相当bad!即便google不禁止,一般情况下我们也不会这么做吧~

所以,也就是说,在Honeycomb SDK(3.0)以下的版本,你还可以继续在Main Thread里这样做,在3.0以上,就不行了,建议

 

1,和network有关比较耗时的操作放到一个子线程里,然后用Handler消息机制与主线程通信。

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. public void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     this.setContentView(R.layout.test);  
  4.     // 开启一个子线程,进行网络操作,等待有返回结果,使用handler通知UI  
  5.     new Thread(networkTask).start();  
  6. }  
  7.   
  8. Handler handler = new Handler() {  
  9.     @Override  
  10.     public void handleMessage(Message msg) {  
  11.         super.handleMessage(msg);  
  12.         Bundle data = msg.getData();  
  13.         String val = data.getString("value");  
  14.         Log.i("mylog""请求结果为-->" + val);  
  15.         // TODO  
  16.         // UI界面的更新等相关操作  
  17.     }  
  18. };  
  19.   
  20. /** 
  21.  * 网络操作相关的子线程 
  22.  */  
  23. Runnable networkTask = new Runnable() {  
  24.   
  25.     @Override  
  26.     public void run() {  
  27.         // TODO  
  28.         // 在这里进行 http request.网络请求相关操作  
  29.         Message msg = new Message();  
  30.         Bundle data = new Bundle();  
  31.         data.putString("value""请求结果");  
  32.         msg.setData(data);  
  33.         handler.sendMessage(msg);  
  34.     }  
  35. };  


2,使用异步机制如:asynctask,这个举个简单的加载网络图片的例子

 

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. class DownImage extends AsyncTask {  
  2.   
  3.     private ImageView imageView;  
  4.   
  5.     public DownImage(ImageView imageView) {  
  6.         this.imageView = imageView;  
  7.     }  
  8.   
  9.     @Override  
  10.     protected Bitmap doInBackground(String... params) {  
  11.         String url = params[0];  
  12.         Bitmap bitmap = null;  
  13.         try {  
  14.             //加载一个网络图片  
  15.             InputStream is = new URL(url).openStream();  
  16.             bitmap = BitmapFactory.decodeStream(is);  
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         }  
  20.         return bitmap;  
  21.     }  
  22.   
  23.     @Override  
  24.     protected void onPostExecute(Bitmap result) {  
  25.         imageView.setImageBitmap(result);  
  26.     }  
  27. }  


3,直接在main Thread 进行网络操作的方法,网上给出的,我没有具体测试:

 

在发起Http请求的Activity里面的onCreate函数里面添加如下代码:

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
  2.         .detectDiskReads().detectDiskWrites().detectNetwork()  
  3.         .penaltyLog().build());  
  4. StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()  
  5.         .detectLeakedSqlLiteObjects().detectLeakedClosableObjects()  
  6.         .penaltyLog().penaltyDeath().build());  



 

请记住,如果在Main Thread里声明了一个handler,这个handler所Post 的 Runnable(Thread)、以及处理的message都是在当前的mian线程里,非子线程。

分享到:
评论

相关推荐

    Caused by: android.os.NetworkOnMainThreadException错误解决办法

    在Android开发中,`Caused by: android.os.NetworkOnMainThreadException` 是一个常见的错误,它意味着开发者尝试在主线程(UI线程)中执行网络操作,这是被禁止的。自Android 4.0 (API Level 14)以后,为了保证用户...

    Android 主线程Exception解决方案Demo

    当开发者违反这一规则时,系统会抛出`Android.os.NetworkOnMainThreadException`,提示主线程异常。 针对这个问题,Android提供了一些解决方案来确保网络请求等耗时操作不在主线程中执行。以下是几种常见的处理方式...

    android 异常捕获

    4. **异常类型处理**:对于特定类型的异常,如`NetworkOnMainThreadException`(主线程网络操作异常),我们可以针对性地处理,避免应用崩溃,同时给出用户友好的提示。 5. **使用第三方库**:市面上有很多成熟的...

    Android 关于“NetworkOnMainThreadException”问题的原因分析及解决办法

    在Android开发中,"NetworkOnMainThreadException"是一个常见的运行时异常,它表示应用程序尝试在网络主线程上执行网络操作。这是由于Android系统为了提高用户体验和防止应用无响应(ANR)情况的发生,从Android 3.0...

    Android服务器端交互Android端代码

    此外,Android的网络操作必须在非主线程中进行,否则会抛出NetworkOnMainThreadException异常。因此,通常我们会使用异步任务、AsyncTask或者上述提到的Volley等库的异步处理机制。 文件名为"TestAndroid"可能包含...

    android 2.3以后的socket注意

    开发者必须在其他线程(如工作线程或AsyncTask)中执行Socket通信,否则会触发`NetworkOnMainThreadException`异常。这是因为Socket操作可能需要等待网络响应,如果在主线程上执行,将可能导致用户界面冻结。 2. **...

    Android网络通信之网络图片查看器事例代码

    本文将深入探讨如何处理“android.os.NetworkOnMainThreadException”这一常见的异常,该异常通常发生在尝试在网络主线程上执行网络操作时。理解这个问题并找到解决方案对于优化应用性能和提升用户体验至关重要。 ...

    android判断网络端口是否可达

    - 在Android环境中,网络操作必须在主线程之外执行,否则会触发`NetworkOnMainThreadException`。因此,推荐使用AsyncTask、Handler或新的异步API(如Coroutines)来处理网络请求。 - 需要在AndroidManifest.xml中...

    Android开发简单获取网页数据

    首先,Android应用进行网络操作时,必须在主线程之外执行,否则会触发"NetworkOnMainThreadException"异常。因此,我们通常采用AsyncTask或者使用Handler、Runnable配合Looper进行异步处理。此外,Android 6.0(API...

    线程实现的Android访问网络资源

    如果这样做,应用会抛出`NetworkOnMainThreadException`异常。 - 网络请求通常涉及HTTP协议,可以使用HTTP/1.1或更新的HTTP/2协议。Android SDK提供了`HttpURLConnection`类作为标准的HTTP客户端,而第三方库如...

    安卓Android源码——安卓Android 解析json_dome.zip

    解析JSON时可能会遇到格式错误、网络错误等问题,因此需要正确处理异常,如JSONException、NetworkOnMainThreadException等。 9. 性能优化: 对大量JSON数据进行解析时,要考虑性能优化,如异步处理、使用流式...

    TCP在Android中的使用

    此外,由于Android系统的安全性,如果应用是在主线程中执行网络操作,可能会导致`NetworkOnMainThreadException`。因此,网络操作应该在子线程或使用`AsyncTask`、`Handler`等机制来避免阻塞UI线程。 总结起来,TCP...

    androidsocket通信 android聊天室代码

    - 在Android环境中,网络操作必须在子线程(非主线程)中执行,否则会触发NetworkOnMainThreadException。因此,通常我们会使用AsyncTask或其他异步处理方式来处理Socket通信。 综上所述,"android socket通信 ...

    android 网络编程详解代码第7章(android的Socket编程)

    此外,Android系统对网络操作有特定的限制,比如必须在主线程外执行网络操作,否则会触发`NetworkOnMainThreadException`。因此,通常我们会使用AsyncTask、IntentService或者Retrofit等异步框架来处理网络任务。 ...

    Android HttpURLConnection中 StrictMode同时支持3.0以上和3.0以下版本

    而在Android 3.0及以上版本,如果在主线程中进行网络操作,`StrictMode`会抛出`NetworkOnMainThreadException`异常。因此,为了使应用在不同版本上都能正常运行,我们需要对代码进行兼容性处理。 首先,我们需要...

    android利用httppost实现和服务器的通讯

    Android系统对网络操作进行了严格的限制,所有网络请求必须在主线程之外进行,否则会抛出`NetworkOnMainThreadException`异常。因此,我们通常会使用`AsyncTask`、`Handler`、`IntentService`或`Thread/Retrofit`等...

    android常见错误集

    9. **NetworkOnMainThreadException**:自Android 3.0起,直接在主线程进行网络操作会被禁止,应使用AsyncTask、Handler或Retrofit等异步网络库。 10. **权限问题**:Android 6.0以后引入了运行时权限,若在运行时...

    Android和servlet交互的用户登录演示例子

    5. **异步处理**:由于Android应用的网络请求不能在主线程中执行,否则会引发“NetworkOnMainThreadException”异常。因此,我们需要使用AsyncTask、IntentService、Handler或现代的Coroutines(适用于Kotlin)等...

    Android Studio Socket通讯客户端.rar

    值得注意的是,由于Android的安全机制,网络操作必须在主线程之外进行,否则会抛出`NetworkOnMainThreadException`。因此,通常我们会将Socket通信逻辑封装在AsyncTask或其他后台线程中。 总之,学习和掌握Socket...

    android本地实现tcp连接

    - Android应用需要在主线程外执行网络操作,否则会触发NetworkOnMainThreadException。因此,通常我们会使用AsyncTask或者IntentService进行异步处理。 - 需要处理各种异常,如SocketException、IOException等,...

Global site tag (gtag.js) - Google Analytics