Android中处理异常——代码

来源:互联网 发布:mac使命召唤4汉化补丁 编辑:程序博客网 时间:2024/06/08 05:24

1、

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="Crash.w.w"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:name=".CrashApplication" android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="8" />

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
</manifest>

2、

package Crash.w.w;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
 private String s; 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println(s.equals("any string")); 
    }
}

3、

package Crash.w.w;

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.io.Writer; 
import java.lang.Thread.UncaughtExceptionHandler; 
import java.lang.reflect.Field; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.Map; 
 
import android.content.Context; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.content.pm.PackageManager.NameNotFoundException; 
import android.os.Build; 
import android.os.Environment; 
import android.os.Looper; 
import android.util.Log; 
import android.widget.Toast;

public class CrashHandler implements UncaughtExceptionHandler { 
     
    public static final String TAG = "CrashHandler"; 
     
    //系统默认的UncaughtException处理类   
    private Thread.UncaughtExceptionHandler mDefaultHandler; 
    //CrashHandler实例  
    private static CrashHandler INSTANCE = new CrashHandler(); 
    //程序的Context对象  
    private Context mContext; 
    //用来存储设备信息和异常信息  
    private Map<String, String> infos = new HashMap<String, String>(); 
 
    //用于格式化日期,作为日志文件名的一部分  
    private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); 
 
    /** 保证只有一个CrashHandler实例 */ 
    private CrashHandler() { 
    } 
 
    /** 获取CrashHandler实例 ,单例模式 */ 
    public static CrashHandler getInstance() { 
        return INSTANCE; 
    } 
 
    /**
     * 初始化
     * 
     * @param context
     */ 
    public void init(Context context) { 
        mContext = context; 
        //获取系统默认的UncaughtException处理器  
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); 
        //设置该CrashHandler为程序的默认处理器  
        Thread.setDefaultUncaughtExceptionHandler(this); 
    } 
 
    /**
     * 当UncaughtException发生时会转入该函数来处理
     */ 
    @Override 
    public void uncaughtException(Thread thread, Throwable ex) { 
        if (!handleException(ex) && mDefaultHandler != null) { 
            //如果用户没有处理则让系统默认的异常处理器来处理  
            mDefaultHandler.uncaughtException(thread, ex); 
        } else { 
            try { 
                Thread.sleep(3000); 
            } catch (InterruptedException e) { 
                Log.e(TAG, "error : ", e); 
            } 
            //退出程序  
            android.os.Process.killProcess(android.os.Process.myPid()); 
            System.exit(1); 
        } 
    } 
 
    /**
     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
     * 
     * @param ex
     * @return true:如果处理了该异常信息;否则返回false.
     */ 
    private boolean handleException(Throwable ex) { 
        if (ex == null) { 
            return false; 
        } 
        //使用Toast来显示异常信息  
        new Thread() { 
            @Override 
            public void run() { 
                Looper.prepare(); 
                Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_LONG).show(); 
                Looper.loop(); 
            } 
        }.start(); 
        //收集设备参数信息   
        collectDeviceInfo(mContext); 
        //保存日志文件   
        saveCrashInfo2File(ex); 
        return true; 
    } 
     
    /**
     * 收集设备参数信息
     * @param ctx
     */ 
    public void collectDeviceInfo(Context ctx) { 
        try { 
            PackageManager pm = ctx.getPackageManager(); 
           PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_ACTIVITIES); 
            if (pi != null) { 
                String versionName = pi.versionName == null ? "null" : pi.versionName; 
                String versionCode = pi.versionCode + ""; 
                infos.put("versionName", versionName); 
                infos.put("versionCode", versionCode); 
            } 
        } catch (NameNotFoundException e) { 
            Log.e(TAG, "an error occured when collect package info", e); 
        } 
        Field[] fields = Build.class.getDeclaredFields(); 
        for (Field field : fields) { 
            try { 
                field.setAccessible(true); 
                infos.put(field.getName(), field.get(null).toString()); 
                Log.d(TAG, field.getName() + " : " + field.get(null)); 
            } catch (Exception e) { 
                Log.e(TAG, "an error occured when collect crash info", e); 
            } 
        } 
    } 
 
    /**
     * 保存错误信息到文件中
     * 
     * @param ex
     * @return  返回文件名称,便于将文件传送到服务器
     */ 
    private String saveCrashInfo2File(Throwable ex) { 
         
        StringBuffer sb = new StringBuffer(); 
        for (Map.Entry<String, String> entry : infos.entrySet()) { 
            String key = entry.getKey(); 
            String value = entry.getValue(); 
            sb.append(key + "=" + value + "\n"); 
        } 
         
        Writer writer = new StringWriter(); 
        PrintWriter printWriter = new PrintWriter(writer); 
        ex.printStackTrace(printWriter); 
        Throwable cause = ex.getCause(); 
        while (cause != null) { 
            cause.printStackTrace(printWriter); 
            cause = cause.getCause(); 
        } 
        printWriter.close(); 
        String result = writer.toString(); 
        sb.append(result); 
        try { 
            long timestamp = System.currentTimeMillis(); 
            String time = formatter.format(new Date()); 
            String fileName = "crash-" + time + "-" + timestamp + ".log"; 
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
                String path = "/sdcard/crash/"; 
               File dir = new File(path); 
                if (!dir.exists()) { 
                    dir.mkdirs(); 
                } 
                FileOutputStream fos = new FileOutputStream(path + fileName); 
                fos.write(sb.toString().getBytes()); 
                fos.close(); 
            } 
            return fileName; 
        } catch (Exception e) { 
            Log.e(TAG, "an error occured while writing file...", e); 
        } 
        return null; 
    } 

4、

package Crash.w.w;

import android.app.Application;

public class CrashApplication extends Application { 
    @Override 
    public void onCreate() { 
        super.onCreate(); 
        CrashHandler crashHandler = CrashHandler.getInstance(); 
        crashHandler.init(getApplicationContext()); 
    } 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 8个月孩子发烧38度怎么办 6个月孩子发烧38度多怎么办 7个月孩子发烧38度怎么办 小明上课总是东张西望你该怎么办 初中二年级贪玩游戏说不听怎么办 孩子上课经常和别的同学说话怎么办 小孩五年级了上课坐不住怎么办 孩子老是纠结小事抓不住重点怎么办 没文化不懂教不了孩孑怎么办 孩孑学习不好老师不让上课怎么办 5个月婴儿睡得少怎么办 教育案例——幼儿爱打小报告怎么办 上班的时候同事老是爱插话怎么办 孕晚期右侧卧睡觉宝宝好动怎么办 乐扣玻璃碗盖子长霉怎么办 乐扣保鲜盒密封圈有异味怎么办 8个月的宝宝不吃饭怎么办 宝宝十一个月了不爱吃饭怎么办 一岁八个月宝宝不爱吃饭怎么办 14个月的宝宝不爱吃饭怎么办 宝宝一岁多又黑又瘦又小该怎么办? 15个月宝宝偏瘦该怎么办 早期肺癌手术后身体瘦该怎么办 4个月婴儿的眼里有触摸糊怎么办 七个月宝宝断奶不喝奶粉怎么办 2个月的宝宝抓头怎么办 4岁宝宝吃东西一点都不认真怎么办 猫吐了白色黏液或泡沫怎么办 六个月的宝宝拉肚子老不好怎么办 小狗狗呕吐后拉肚子带血怎么办 八个月宝宝拉肚子拉出点血怎么办 在饿了么点外卖吃出虫子怎么办 1岁半宝宝拉肚子拉水怎么办 五个多月宝宝拉鼻涕便怎么办 一岁宝宝拉鼻涕样大便怎么办 宝宝拉粘液大便鼻涕状的怎么办 十个月宝宝拉鼻涕一样大便怎么办 7个月宝宝咳嗽反反复复发热怎么办 婴儿3个月突然不吃奶瓶怎么办? 2个月婴儿突然不肯用奶瓶怎么办 喝母乳的宝宝不喝奶瓶怎么办