看名字就应该知道,是网络请求在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消息机制与主线程通信。
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.test);
- // 开启一个子线程,进行网络操作,等待有返回结果,使用handler通知UI
- new Thread(networkTask).start();
- }
- Handler handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- Bundle data = msg.getData();
- String val = data.getString("value");
- Log.i("mylog", "请求结果为-->" + val);
- // TODO
- // UI界面的更新等相关操作
- }
- };
- /**
- * 网络操作相关的子线程
- */
- Runnable networkTask = new Runnable() {
- @Override
- public void run() {
- // TODO
- // 在这里进行 http request.网络请求相关操作
- Message msg = new Message();
- Bundle data = new Bundle();
- data.putString("value", "请求结果");
- msg.setData(data);
- handler.sendMessage(msg);
- }
- };
2,使用异步机制如:asynctask,这个举个简单的加载网络图片的例子
- class DownImage extends AsyncTask {
- private ImageView imageView;
- public DownImage(ImageView imageView) {
- this.imageView = imageView;
- }
- @Override
- protected Bitmap doInBackground(String... params) {
- 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) {
- imageView.setImageBitmap(result);
- }
- }
3,直接在main Thread 进行网络操作的方法,网上给出的,我没有具体测试:
在发起Http请求的Activity里面的onCreate函数里面添加如下代码:
- StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
- .detectDiskReads().detectDiskWrites().detectNetwork()
- .penaltyLog().build());
- StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
- .detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
- .penaltyLog().penaltyDeath().build());
请记住,如果在Main Thread里声明了一个handler,这个handler所Post 的 Runnable(Thread)、以及处理的message都是在当前的mian线程里,非子线程。
相关推荐
在Android开发中,`Caused by: android.os.NetworkOnMainThreadException` 是一个常见的错误,它意味着开发者尝试在主线程(UI线程)中执行网络操作,这是被禁止的。自Android 4.0 (API Level 14)以后,为了保证用户...
当开发者违反这一规则时,系统会抛出`Android.os.NetworkOnMainThreadException`,提示主线程异常。 针对这个问题,Android提供了一些解决方案来确保网络请求等耗时操作不在主线程中执行。以下是几种常见的处理方式...
4. **异常类型处理**:对于特定类型的异常,如`NetworkOnMainThreadException`(主线程网络操作异常),我们可以针对性地处理,避免应用崩溃,同时给出用户友好的提示。 5. **使用第三方库**:市面上有很多成熟的...
在Android开发中,"NetworkOnMainThreadException"是一个常见的运行时异常,它表示应用程序尝试在网络主线程上执行网络操作。这是由于Android系统为了提高用户体验和防止应用无响应(ANR)情况的发生,从Android 3.0...
此外,Android的网络操作必须在非主线程中进行,否则会抛出NetworkOnMainThreadException异常。因此,通常我们会使用异步任务、AsyncTask或者上述提到的Volley等库的异步处理机制。 文件名为"TestAndroid"可能包含...
开发者必须在其他线程(如工作线程或AsyncTask)中执行Socket通信,否则会触发`NetworkOnMainThreadException`异常。这是因为Socket操作可能需要等待网络响应,如果在主线程上执行,将可能导致用户界面冻结。 2. **...
本文将深入探讨如何处理“android.os.NetworkOnMainThreadException”这一常见的异常,该异常通常发生在尝试在网络主线程上执行网络操作时。理解这个问题并找到解决方案对于优化应用性能和提升用户体验至关重要。 ...
- 在Android环境中,网络操作必须在主线程之外执行,否则会触发`NetworkOnMainThreadException`。因此,推荐使用AsyncTask、Handler或新的异步API(如Coroutines)来处理网络请求。 - 需要在AndroidManifest.xml中...
首先,Android应用进行网络操作时,必须在主线程之外执行,否则会触发"NetworkOnMainThreadException"异常。因此,我们通常采用AsyncTask或者使用Handler、Runnable配合Looper进行异步处理。此外,Android 6.0(API...
如果这样做,应用会抛出`NetworkOnMainThreadException`异常。 - 网络请求通常涉及HTTP协议,可以使用HTTP/1.1或更新的HTTP/2协议。Android SDK提供了`HttpURLConnection`类作为标准的HTTP客户端,而第三方库如...
解析JSON时可能会遇到格式错误、网络错误等问题,因此需要正确处理异常,如JSONException、NetworkOnMainThreadException等。 9. 性能优化: 对大量JSON数据进行解析时,要考虑性能优化,如异步处理、使用流式...
此外,由于Android系统的安全性,如果应用是在主线程中执行网络操作,可能会导致`NetworkOnMainThreadException`。因此,网络操作应该在子线程或使用`AsyncTask`、`Handler`等机制来避免阻塞UI线程。 总结起来,TCP...
- 在Android环境中,网络操作必须在子线程(非主线程)中执行,否则会触发NetworkOnMainThreadException。因此,通常我们会使用AsyncTask或其他异步处理方式来处理Socket通信。 综上所述,"android socket通信 ...
此外,Android系统对网络操作有特定的限制,比如必须在主线程外执行网络操作,否则会触发`NetworkOnMainThreadException`。因此,通常我们会使用AsyncTask、IntentService或者Retrofit等异步框架来处理网络任务。 ...
而在Android 3.0及以上版本,如果在主线程中进行网络操作,`StrictMode`会抛出`NetworkOnMainThreadException`异常。因此,为了使应用在不同版本上都能正常运行,我们需要对代码进行兼容性处理。 首先,我们需要...
Android系统对网络操作进行了严格的限制,所有网络请求必须在主线程之外进行,否则会抛出`NetworkOnMainThreadException`异常。因此,我们通常会使用`AsyncTask`、`Handler`、`IntentService`或`Thread/Retrofit`等...
9. **NetworkOnMainThreadException**:自Android 3.0起,直接在主线程进行网络操作会被禁止,应使用AsyncTask、Handler或Retrofit等异步网络库。 10. **权限问题**:Android 6.0以后引入了运行时权限,若在运行时...
5. **异步处理**:由于Android应用的网络请求不能在主线程中执行,否则会引发“NetworkOnMainThreadException”异常。因此,我们需要使用AsyncTask、IntentService、Handler或现代的Coroutines(适用于Kotlin)等...
值得注意的是,由于Android的安全机制,网络操作必须在主线程之外进行,否则会抛出`NetworkOnMainThreadException`。因此,通常我们会将Socket通信逻辑封装在AsyncTask或其他后台线程中。 总之,学习和掌握Socket...
- Android应用需要在主线程外执行网络操作,否则会触发NetworkOnMainThreadException。因此,通常我们会使用AsyncTask或者IntentService进行异步处理。 - 需要处理各种异常,如SocketException、IOException等,...