• Android-ANR异常


    A N R :

    Application Not Responding : 应用没有响应异常

     

    引发ANR的原因是,组件的主线程去执行了耗时操作多少秒,就会引发ARN异常;

    引发ANR异常的案例:

    package com.example.administrator.myapplication;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(10000);
    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            Toast.makeText(this, "onCreate执行完毕.....", Toast.LENGTH_SHORT).show();
    
        }
    }

     执行结果:此ANR异常时Android操作系统报出的,操作系统检测到组件被阻塞,认为此应用,需要结束掉了 

    线程执行图:


    解决方案:

    在组件的主线程加入子线程,保证不影响主线程,保证不阻塞主线程,只要保证组件的主线程正常运行就不会引发ANR异常

    package com.example.administrator.myapplication;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            /**
             * 增加子线程执行耗时操作,保证主线程正常运行
             */
            new Thread(){
    
                @Override
                public void run() {
                    super.run();
    
                    for (int i = 0; i < 10; i++) {
                        try {
                            Thread.sleep(10000);
    
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
    
                }
            }.start();
    
            /**
             * 增加了子线程 后 不影响组件的主线程运行
             */
            
            // 提示
            Toast.makeText(this, "onCreate执行完毕.....", Toast.LENGTH_SHORT).show();
    
        }
    }

     执行结果,增加了子线程就不影响主线程运行了,从而就不会引发ANR异常:

     线程执行图:

  • 相关阅读:
    到底有多少种智能指针(smart pointer)
    QSettings提供了非常方便的注册表读写
    阿里腾讯亿元级投资版图:阿里爱买超市,腾讯娱乐至上(恐怖)
    gcc安装教程(学习Linux编程只需安装cygwin)
    苹果抛弃的芯片公司Imagination被中资49亿溢价收购
    NET Core2
    HelloWorld RabbitMQ
    redis 集群
    kafka
    Impala简介PB级大数据实时查询分析引擎
  • 原文地址:https://www.cnblogs.com/android-deli/p/10260061.html
Copyright © 2020-2023  润新知