zoukankan      html  css  js  c++  java
  • Android学习笔记_67_Android MyCrashHandler 中异常处理 UncaughtExceptionHandler

    1、程序中故意抛出异常:

    public class ExceptionActivity extends Activity {
        
        String str;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            str.equals("exception");
     
        }
    }

    2、实现UncaughtExceptionHandler接口:

    public class MyCrashHandler implements UncaughtExceptionHandler {
        // 保证MyCrashHandler只有一个实例
        // 2.提供一个静态的程序变量
        private static MyCrashHandler myCrashHandler;
        private Context context;
    
        // 1.私有化构造方法
        private MyCrashHandler() {
    
        }
    
        // 3.暴露出来一个静态的方法 获取myCrashHandler
    
        public static synchronized MyCrashHandler getInstance() {
            if (myCrashHandler == null) {
                myCrashHandler = new MyCrashHandler();
            }
            return myCrashHandler;
        }
    
        public void init(Context context) {
            this.context = context;
        }
    
        // 程序发生异常的时候调用的方法
        // try catch
    
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            System.out.println("出现错误啦 哈哈");
            StringBuilder sb = new StringBuilder();
            // 1.获取当前应用程序的版本号.
            PackageManager pm = context.getPackageManager();
            try {
                PackageInfo packinfo = pm.getPackageInfo(context.getPackageName(),
                        0);
                sb.append("程序的版本号为" + packinfo.versionName);
                sb.append("
    ");
    
                // 2.获取手机的硬件信息.
                Field[] fields = Build.class.getDeclaredFields();
                for (int i = 0; i < fields.length; i++) {
                    // 暴力反射,获取私有的字段信息
                    fields[i].setAccessible(true);
                    String name = fields[i].getName();
                    sb.append(name + " = ");
                    String value = fields[i].get(null).toString();
                    sb.append(value);
                    sb.append("
    ");
                }
                // 3.获取程序错误的堆栈信息 .
                StringWriter writer = new StringWriter();
                PrintWriter printWriter = new PrintWriter(writer);
                ex.printStackTrace(printWriter);
                
                String result =    writer.toString();
                sb.append(result);
                
                
                System.out.println(sb.toString());
    
                // 4.把错误信息 提交到服务器
                
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            // 完成自杀的操作
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    
    }

    3、注册UncaughtExceptionHandler接口的实现类:

    public class MyApp extends Application {
    
        //在整个应用第一次被创建出来的时候 执行 
        // 在应用程序对应的进程 第一次创建出来的时候执行 
        @Override
        public void onCreate() {
            super.onCreate();
            //把自定义的异常处理类设置 给主线程 
            MyCrashHandler myCrashHandler =    MyCrashHandler.getInstance();
            myCrashHandler.init(getApplicationContext());
            Thread.currentThread().setUncaughtExceptionHandler(myCrashHandler);
        }
    }

    4、修改配置文件:

    <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name" android:name="MyApp">
            <activity
                android:label="@string/app_name"
                android:name=".ExceptionActivity" >
                <intent-filter >
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    </application>
  • 相关阅读:
    Python函数篇(2)-递归函数、匿名函数及高阶函数(已更新)
    Python函数篇(1)-函数中的形参与实参(已更新)
    Pyhton基础篇(6)-非基本数据类型 --集合(已更新)
    Pyhton基础篇(5)-基本数据类型-列表、元组、字典(已更新)
    Pyhton基础篇(4)-基本数据类型-字符串详解(已更新)
    Pyhton基础篇(3)-Pycharm安装及运算符(已更新)
    Pyhton基础篇(2)-变量、用户输入及条件语句(已更新)
    Pyhton基础篇(1)-第一个Pyhton程序(已更新)
    gallery的3D效果的实现
    android 图片二维码识别和保存(一)
  • 原文地址:https://www.cnblogs.com/lbangel/p/3621956.html
Copyright © 2011-2022 走看看