Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 1186|回复: 0

android 全局异常的处理 详解

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-1 10:54:05 | 显示全部楼层 |阅读模式

    Android游戏《歪把子炮》源码
    http://www.eoeandroid.com/thread-197425-1-1.html

    Android 新版捕鱼达人源码
    http://www.eoeandroid.com/thread-197437-1-1.html

    Android版本的手机RSS阅读器的源码
    http://www.eoeandroid.com/thread-197465-1-1.html

     

    最近新产品测试,频频出现异常。所以需要对异常进行全局捕捉。
    翻阅大量帖子、源码终于找到了UncaughtExceptionHandler接口。废话不多说还是直接上源码吧。


    首先实现UncaughtExceptionHandler

    public class CatchHandler implements UncaughtExceptionHandler{
     
            private CatchHandler() {
            }
     
            public static CatchHandler getInstance() {
     
                    return mCatchHandler;
            }
     
            private static CatchHandler mCatchHandler = new CatchHandler();
     
            private Context mContext;
     
            private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
     
            @Override
            public void uncaughtException(Thread thread, Throwable ex) {
                    if (thread.getName().equals("main")) {
                            ToastException(thread, ex);
                            try {
                                    Thread.sleep(3000);
                            } catch (InterruptedException e) {
                            }
                            android.os.Process.killProcess(android.os.Process.myPid());
                            System.exit(1);
                    } else {
                            handleException(thread, ex);
                    }
     
            }
     
            public void init(Context context) {
                    mContext = context;
                    Thread.setDefaultUncaughtExceptionHandler(this);
            }
     
            private void ToastException(final Thread thread, final Throwable ex) {
                    new Thread() {
                            @Override
                            public void run() {
                                    Looper.prepare();
                                    StringBuilder builder = new StringBuilder();
                                    builder.append("At thread: ").append(thread.getName())
                                                    .append("\n");
                                    builder.append("Exception is :\n").append(ex.getMessage());
     
                                    Toast.makeText(mContext, builder.toString(), Toast.LENGTH_LONG)
                                                    .show();
                                    Looper.loop();
                            }
                    }.start();
            }
     
            private void handleException(final Thread thread, final Throwable ex) {
                    Intent intent =new Intent("per.xch.test2_35.main");
                    <font color="#00ed00">intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);</font>
                    mContext.startActivity(intent);
            }
    }

    然后在项目中引用

    public class CatchApplication extends Application {
            @Override
            public void onCreate() {
                    super.onCreate();
                    CatchHandler.getInstance().init(getApplicationContext());
            }
    }

    注意

    <application
            <font color="#00ed00">android:name=".CatchApplication"</font>

    最后测试下

    public class MainActivity extends Activity {
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
             
            new Thread(new Runnable() {
                             
                            @Override
                            public void run() {
                                     throw new NullPointerException("please catch me! sub thread");
                            }
                    }).start();
            throw new NullPointerException("please catch me! sub thread");
            
        }
     
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }

    之所以在主线程和其他线程采用不同处理方式因为主线程崩溃很大程度上就没的救了。
    还有要注意的是intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    原因很简单,源码写的很明白


    ContextImpl.java

      @Override
        public void startActivity(Intent intent) {
            if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
                throw new AndroidRuntimeException(
                        "Calling startActivity() from outside of an Activity "
                        + " context requires the FLAG_ACTIVITY_NEW_TASK flag."
                        + " Is this really what you want?");
            }
            mMainThread.getInstrumentation().execStartActivity(
                getOuterContext(), mMainThread.getApplicationThread(), null,
                (Activity)null, intent, -1);
        }

    至于怎么把activity怎么变成dialog我就不废话喽,吼,闪人。

     

    原文链接:http://www.eoeandroid.com/thread-197442-1-1.html

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-7 06:33 , Processed in 0.065203 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表