Android 中如何捕获未捕获的异常

(一)UncaughtExceptionHandler
1、自定义一个Application , 比如叫MyApplication 继承Application 实现UncaughtExceptionHandler。

2、覆写UncaughtExceptionHandler 的onCreate 和uncaughtException 方法。

@Override
public void onCreate() {
	super.onCreate();
	Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(final Thread thread, final Throwable ex) {
	new Thread(new Runnable() {
		@Override
		public void run() {
			Looper.prepare();
			System.out.println(Thread.currentThread());
			Toast.makeText(getApplicationContext(), "thread="+thread.getId()+"ex="+ex.toString(), 1).show();
			Looper.loop();
		}
	}).start();
	SystemClock.sleep(3000);
	android.os.Process.killProcess(android.os.Process.myPid());
}

注意:上面的代码只是简单的将异常打印出来。
在onCreate 方法中我们给Thread 类设置默认异常处理handler,如果这句代码不执行则一切都是白搭。
在uncaughtException 方法中我们必须新开辟个线程进行我们异常的收集工作,然后将系统给杀死。

3、在AndroidManifest 中配置该Application
<application
android:name="com.example.uncatchexception.MyApplication"
---------------------------------------------------------------------------------
(二)Bug 收集工具Crashlytics
Crashlytics 是专门为移动应用开发者提供的保存和分析应用崩溃的工具。国内主要使用的是友盟做数据统计。
Crashlytics 的好处:
1.Crashlytics 不会漏掉任何应用崩溃信息。
2.Crashlytics 可以象Bug 管理工具那样,管理这些崩溃日志。
3.Crashlytics 可以每天和每周将崩溃信息汇总发到你的邮箱,所有信息一目了然。
使用步骤:
1.注册需要审核通过才能使用,国内同类产品顶多发个邮箱激活链接;
2.支持Eclipse、Intellij IDEA 和Android Studio 等三大IDE;
3.Eclipse 插件是iOS 主题风格UI,跟其他plugin 在一起简直是鹤立鸡群;
4.只要登录帐号并选择项目,会自动导入jar 包并生成一个序列号,然后在AndroidManifest.xml 和启动Activity 的入口添加初始化代码,可以说是一键式操作,当然要使用除错误统计外的其他功能还是得自己添加代码;
5.不像友盟等国内同类产品,将固定的序列号直接写入xml 文件,而是动态自动生成的;当然这个存放序列号的xml 文件也是不能修改和提交到版本控制系统的;
6.后台可以设置邮件提醒,当然这个最好不要开启,Android 开发那数量惊人、千奇百怪的错误信息你懂的。
7.不仅能统计到UncaughtException 这种未捕获的Crash 异常信息,只要在try/catch 代码块的catch 中添加一行代码就能统计到任何异常;
try{ myMethodThatThrows(); }catch(Exception e){ Crashlytics.logException(e);
//handle your exception here! }
8.相当详细的错误信息,不仅仅是简单的打印StackTrace 信息;并且能看到最近一次crash
的机器可用内存等信息,而不仅仅是简单统计机型和版本号。
使用连接:http://blog.csdn.net/smking/article/details/39320695
发布了60 篇原创文章 · 获赞 52 · 访问量 10万+
展开阅读全文

捕获异常的情况下重启停止了的服务

10-18

public class UpdateService extends Service { private Timer timer = new Timer(); private static final long UPDATE_INTERVAL = 60000; private final IBinder mBinder = new MyBinder(); public static boolean isServiceRunning; public void onCreate() { super.onCreate(); pollForUpdates(); } private void pollForUpdates() { timer.scheduleAtFixedRate(new TimerTask() { @SuppressWarnings("rawtypes") @Override public void run() { Log.v("service", "called..."); Thread.setDefaultUncaughtExceptionHandler(onForceCloseError); try { isServiceRunning=true; DatabaseHelper db = new DatabaseHelper(UpdateService.this); BaseObject bObj = db.GetObjectFromDB("GlobalObject1"); long id=Thread.currentThread().getId(); String serviceThreadID= String.valueOf(id); long restaurantID=((GlobalObject) UpdateService.this.getApplication()).getRestuarantID(); RequestProperty rp1 = new RequestProperty("restaurantID", restaurantID); ArrayList<RequestProperty> properties = new ArrayList<RequestProperty>(); properties.clear(); properties.add(rp1); ArrayList customerArrList = SoapInvoker.GetListFromService("GetAllCustomersForRestaurant", properties, new Customer(),UpdateService.this); ArrayList returnArrayList1 = SoapInvoker.GetListFromService("GetAllAirHostessDetails", null,new Airhostess(),UpdateService.this); long branchID = ((GlobalObject) UpdateService.this.getApplication()).getBranchID(); RequestProperty rp = new RequestProperty("branchID", branchID); properties.clear(); properties.add(rp); ArrayList returnArrayList = SoapInvoker.GetListFromService("GetAllActiveOrderDetailsForBranch", properties ,new OrderDetail(),UpdateService.this); ArrayList retArrayList = SoapInvoker.GetListFromService("GetAllActiveOrdersForBranch", properties ,new Orders(),UpdateService.this); ArrayList empTablMapList=SoapInvoker.GetListFromService("GetAllEmployeeTable", null, new EmployeeTable(), UpdateService.this); ArrayList retArrlist1=SoapInvoker.GetListFromService("GetAllTableBookingsForBranch", properties, new TableBooking(), UpdateService.this); ArrayList billingList=SoapInvoker.GetListFromService("GetAllBillsForBranch", properties, new Billing(), UpdateService.this); long orderID=0; if(Long.parseLong(bObj.getClass().getDeclaredField("OrderID").get(bObj).toString()) != 0){ orderID = ((GlobalObject) UpdateService.this.getApplication()).getOrderID(); } if (orderID > 0) { NotConfirmedOrderDetails1(orderID); } //开始 Log.v("Service", "Service call ended."); } catch(Exception e) { Log.e("ServiceError", e.getMessage()); } } }, 0, UPDATE_INTERVAL); Log.i(getClass().getSimpleName(), "Timer started."); } private void NotConfirmedOrderDetails1(long orderID) { try { DatabaseHelper db = new DatabaseHelper(UpdateService.this); db.setOrderDetailsDataToDB(orderID); } catch (Exception e) { CommonMethods.showErrorDialog(e.getMessage(),UpdateService.this); } } @Override public void onDestroy() { super.onDestroy(); if (timer != null) { timer.cancel(); } Log.i(getClass().getSimpleName(), "Timer stopped."); } @Override public IBinder onBind(Intent arg0) { return mBinder; } public class MyBinder extends Binder { UpdateService getService() { return UpdateService.this; } } public Thread.UncaughtExceptionHandler onForceCloseError= new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread thread, Throwable ex) { Log.v("Service stopped", "Service stopped after force close error ..."); Log.v("Service started", "Service started after force close error ..."); } }; private UpdateService s; private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { s = ((UpdateService.MyBinder) binder).getService(); } public void onServiceDisconnected(ComponentName className) { s = null; Log.v("Update Servicve","Service Disconnected..."); } }; void doBindService() { bindService(new Intent(this, UpdateService.class), mConnection, Context.BIND_AUTO_CREATE); Log.v("bindService", "bindService called..."); } } 在android有上述服务代码。系统提醒我获得未捕获的异常,且服务也停止了。执行线程进入UnCaughtExceptionHandler状态。我重新启动服务,但是启动不了。问题出在哪里啊? 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览