美文网首页
耗时方法请一定要做线程检查

耗时方法请一定要做线程检查

作者: peter_RD_nj | 来源:发表于2018-09-12 10:11 被阅读0次

前言

主线程又称UI线程,是不能做耗时任务的,否则会导致UI界面卡顿甚至ANR。 最常见的case就是如果我们在主线程做访问网络操作会抛出NetworkOnMainThreadException异常,抛出这个异常是因为Android在StrictMode中做了相应的检查,如果发现主线程有访问网络的行为就会主动终止并抛出异常。

        public void onNetwork() {
            if ((mPolicyMask & DETECT_NETWORK) == 0) {
                return;
            }
            if ((mPolicyMask & PENALTY_DEATH_ON_NETWORK) != 0) {
                throw new NetworkOnMainThreadException();
            }
            if (tooManyViolationsThisLoop()) {
                return;
            }
            startHandlingViolationException(new NetworkViolation());
        }

解决方法

日常开发中也不可避免的会写一些需要耗时的任务,时间久了有可能忘记或是其他人在使用的时候并不知道这个方法是耗时的,所以请一定要在耗时的方法里面做线程检查,提醒使用者注意不要在主线程使用该方法。 只需要在方法的开始调用下面三行代码,很简单。

        if(Thread.currentThread() == Looper.getMainLooper().getThread()) {
            throw new RuntimeException("Should not be called in main thread.");
        }

相关文章

  • 耗时方法请一定要做线程检查

    前言 主线程又称UI线程,是不能做耗时任务的,否则会导致UI界面卡顿甚至ANR。 最常见的case就是如果我们在主...

  • BlockCanary源码分析

    如何计算主线程中的方法耗时?看一下Looper的loop方法: 耗时的处理会发生在dispatchMessage中...

  • 注意Notification是在当前线程同步执行的

    话不多说,直接上代码: 所以添加在主线程的通知任务不要做耗时操作,否则会阻塞主线程导致卡顿。 如果通知任务是耗时操...

  • BlockCanary源码解析

    BlockCanary原理 如何计算主线程的方法执行耗时 计算方法耗时最简单粗暴的就是在方法之前前记录下开始时间,...

  • http 网络请求

    注:网络请求等耗时代码不要在主线程(UI线程中) HTTPURLCONNECTION get方法: try{URL...

  • Python 多线程

    多线程 1.耗时操作 1.1耗时操作放到主线程中的问题: 耗时操作放到主线程中,会阻塞线程 多个耗时操作都放到一个...

  • day18-多线程

    1. 耗时操作 耗时操作放到主线程中的问题:耗时操作放到主线程中,会阻塞线程多个耗时操作都放到一个线程中执行,最终...

  • Day17-多线程

    1、耗时操作 耗时操作放到主线程中的问题:耗时操作放到主线程中,会阻塞线程多个耗时操作都放到一个线程中执行,最终执...

  • 多线程

    recode 实现多线程方式1 1.耗时操作放到主线程中,会阻塞线程耗时操作放到主线程,会阻塞线程多个耗时操作都放...

  • 多线程

    耗时操作 1.耗时操作放到主线程中的问题:耗时操作放到主线程中,会阻塞线程多个耗时操作都放到一个线程中执行,最终执...

网友评论

      本文标题:耗时方法请一定要做线程检查

      本文链接:https://www.haomeiwen.com/subject/luimgftx.html