开发Android的时候难免会遇到程序异常,为了更好的知道程序的问题然后做出对应的记录或者改进处理是必不可少的。
一下是我处理的一个程序oom的收希望他可以自动重启,释放资源。当然这个只是解决燃眉之急,重要的还是处理好引起这个得原因。这里主要用的是PendingIntenthe和系统AlarmManager。不说了,直接贴代码。
/** * Created by Curry on 2017-3-4. */ public class CrashHandler<T> implements Thread.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>(); final String OOM = "java.lang.OutOfMemoryError"; //用于格式化日期,作为日志文件名的一部分 Class<T> initClass; /** * 保证只有一个CrashHandler实例 */ private CrashHandler() { } /** * 获取CrashHandler实例 ,单例模式 */ public static CrashHandler getInstance() { return INSTANCE; } /** * 初始化 * * @param context * @param initClass 跳转Activity */ public void init(Context context,Class<T> initClass) { mContext = context; this.initClass = initClass; //获取系统默认的UncaughtException处理器 mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); //设置该CrashHandler为程序的默认处理器 Thread.setDefaultUncaughtExceptionHandler(this); } /** * 当UncaughtException发生时会转入该函数来处理 */ @Override public void uncaughtException(Thread thread, Throwable ex) { if (ex.getClass().getName().equals(OOM)) {//判断如果抛出异常是OOM 执行我们自定的操作 PendingIntent intent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, initClass), PendingIntent.FLAG_UPDATE_CURRENT);//设置默认启动的Activity //休眠两秒完成提示后退出 new Thread() { @Override public void run() { Looper.prepare(); Toast.makeText(mContext, "程序异常,正在重启.", Toast.LENGTH_LONG).show(); Looper.loop(); } }.start(); AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, intent);//设置重启时间 } else { //其他异常处理 记录崩溃日志 保存数据等 } try { Thread.sleep(1000); } catch (InterruptedException e) { Log.e(TAG, "error : ", e); } System.exit(2); } }
然后应用的时候需要在Application中初始化一下。
CrashHandler crashHandler = CrashHandler.getInstance(); crashHandler.init(getApplicationContext(),IndexActivity_.class);