zoukankan      html  css  js  c++  java
  • 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异常:

     线程执行图:

  • 相关阅读:
    15:链表中倒数第K个节点
    14:调整数组顺序使奇数位于偶数的前面
    13:在O(1)时间内删除单向链表中的一个节点
    centos7下zookeeper集群安装部署
    zabbix3.2监控mysql
    解决关于confluence缓慢 字体乱码 宏乱码 编辑不能贴图等问题
    nginx日志文件的定时切割与归纳
    centos7安装sonarqube6.7 代码质量管理平台
    centos7下安装vnc更改vnc默认端口号
    centos7安装java环境和maven环境
  • 原文地址:https://www.cnblogs.com/android-deli/p/10260061.html
Copyright © 2011-2022 走看看