zoukankan      html  css  js  c++  java
  • android开发中的ANR异常

    1、什么是ANR异常?

    application not response 应用程序无响应。在用户进行一个操作,如果用户在6秒内没有操作的话,就会出现异常

    image

    代码示例:

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
        
        public void doSomething(View view) throws Exception {
            try {
                Thread.sleep(10000);//让主线程睡眠
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("从网络获取数据成功!");
        }
        
        public void toast(View view) {
            Toast.makeText(this, "十八大开幕了!", 0).show();
        }
    }

    2、为什么会出现ANR异常?

    android系统中处理用户操作的工作时在主线程中执行的,如果我们的程序在主线程中进行一些耗时的操作,导致用户的操作6秒不能够处理,就会出现异常。

    主线程休眠,那么再点击程序,必须等主线程睡醒后才会反应。

    所以在主线程中不要做太耗时的工作,因为主界面会阻塞。

    3、解决办法:让这些耗时的操作放在新线程里面操作。

    注意:如果新线程里面做的事情要更新界面的话,就要使用handler来操作。

    连接网络的事都要放在新线程里面的。

    解决代码(包括更新界面的操作,使用的是handler):

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
        private TextView numTV;
        private Handler handler = new Handler();
        private int i;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            numTV = (TextView) findViewById(R.id.numTV);
        }
    
        public void doSomething(View view) throws Exception {
            new Thread() {
                public void run() {
                    for (i = 1; i < 20; i++) {
                        handler.post(new Runnable() {
                            public void run() {
                                numTV.setText(i + "");
                            }
                        });
                        System.out.println(i);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
            }.start();
        }
    
        public void toast(View view) {
            Toast.makeText(this, "十八大开幕了!", 0).show();
        }
    }

    image

    如果,这篇博客帮您解决了问题,不妨点击一下右下角的【推荐】。

    如果,您希望更容易地发现我的新博客,不妨点击一下【加关注】。

    因为,我的热情需要您的肯定和支持! 

    感谢您的阅读,如果文章中有错误或者您有什么好的建议,也欢迎您直接留言批评指教。Thanks,friends!




  • 相关阅读:
    面试题:链表倒数第k个节点
    面试题:重建二叉树
    面试题:从尾到头打印链表
    面试题:第一个出现的字符位置
    面试题:调整数组顺序
    面试题:有限制条件的求和
    面试题:Fibonacci数列
    面试题:旋转数组的最小数字
    面试题:替换空格
    EndNote8破解版下载安装
  • 原文地址:https://www.cnblogs.com/yejiurui/p/2760342.html
Copyright © 2011-2022 走看看