① androidstudio中怎么捕获异常
//可以使用try catch finally语句来捕获异常。
//代码格式:
try{
//如果要捕获异常,需要将代码放置在这try的代码块范围内
}catch(IOException ex){//异常范围IOException 以及它的派生类异常
//此处编写发生 IOException 或其派生类异常时处理方案
}catch(Exception ex){//异常范围Exception 以及它的派生类异常
//此处编写发生Exception 或其派生类异常时处理方案
}finally{
//此处无论上方的代码中是否出现了异常、return语句,这里必定执行。
}
/*
try catch语句至少需要有一个catch,却可以同时有多个catch。
其中catch语句块的异常范围从上到下顺序书写时应当从小范围到达范围,如果将Exception的catch与IOException的catch位置对换,那么永远不会执行IOException的catch块的代码
finally语句代码块是可选的。可以有它,也可以不使用它,具体是否启用它需要根据业务逻辑决定
*/
② 如何监控android系统中其他程序的崩溃信息
哎呦 想想每次我们APP崩溃的时候都会弹出一个对话框,这说明系统已经捕获到了崩溃异常,所以我们可以追踪系统是怎么捕获到的
③ 捕获到异常怎么处理android就不会挂掉
UncaughtExceptionHandler接口
这个接口,顾名思义,就是处理程序中没有处理的异常,而且是在系统抛出异常导致程序异常终止之前哦!
1. 首先,咱们得创建一个UncaughtExceptionHandler的具体类,比如:
复制内容到剪贴板
代码:
public class CrashHandler implements UncaughtExceptionHandler {
private static CrashHandler instance; //单例引用,这里我们做成单例的,因为我们一个应用程序里面只需要一个UncaughtExceptionHandler实例
private CrashHandler(){}
public synchronized static CrashHandler getInstance(){ //同步方法,以免单例多线程环境下出现异常
if (instance == null){
instance = new CrashHandler();
}
return instance;
}
public void init(Context ctx){ //初始化,把当前对象设置成UncaughtExceptionHandler处理器
Thread.(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) { //当有未处理的异常发生时,就会来到这里。。
Log.d("Sandy", "uncaughtException, thread: " + thread
+ " name: " + thread.getName() + " id: " + thread.getId() + "exception: "
+ ex);
String threadName = thread.getName();
if ("sub1".equals(threadName)){
Log.d("Sandy", ""xxx);
}else if(){
//这里我们可以根据thread name来进行区别对待,同时,我们还可以把异常信息写入文件,以供后来分析。
}
}
}
2. 其次,我们自定义Application类
复制内容到剪贴板
代码:
public class OurApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler handler = CrashHandler.getInstance();
handler.init(getApplicationContext()); //在Appliction里面设置我们的异常处理器为UncaughtExceptionHandler处理器
}
}
3. 配置AndroidManifest.xml文件
由于我们使用自定义的Application,所以我们要在AndroidManifest.xml文件中申明它
复制内容到剪贴板
代码:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name=".OurApplication"
android:debuggable="true"
>
4. 测试
我们在Activity里面启动一个线程,然后线程里面抛出一个异常,看看程序会怎么样
复制内容到剪贴板
代码:
Button btn = (Button) findViewById(R.id.bt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Log.d("Sandy", "I am a sub thread");
String s = null;
s.toString(); //抛出NullPointException
}
}, "sub thread");
thread.start();
}
5. 结果
由于我们有默认未处理异常的处理程序,所以会打印下面的日志信息,而不会抛出异常导致程序异常终止
D/Sandy ( 2228): I am a sub thread
D/Sandy ( 2228): uncaughtException, thread: Thread[sub thread,5,main] name: sub thread id: 148exception: java.lang.NullPointerException
大家还等什么呢?赶紧在自己的应用里面添加上默认未处理异常处理器吧!再也不会因为异常未捕获发生程序崩溃了。。^_^
④ android 应用启动之前,没有经过activity就崩溃,怎么捕捉
使用android手机的用户可能都安装了任务管理的软件,使用android手机真的有必要安装结束任务的软件吗? 大家在使用中也都发现了,很多软件在被结束后,马上就会又出现在任务列表里,或是稍等一会自己也会出现,任务管理不停的结束后台程序,也没见给手机的运行速度带来多少提升,这是为什么呢? 其实大家不用那么在意android手机剩余内存的大小。很多人都是把使用其他系统的习惯带到了android手机上,不是所有的智能手机系统都一样的。android大多数应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系。如果你知道java,就能更清楚这机制了。其实和java的垃圾回收机制类似,系统有一个规则来回收内存。进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西。当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊。但事实上他并不影响速度。相反加快了下次启动应用的速度。这本来也是android的优势之一,如果人为去关闭进程,没有太大必要。特别是自动关进程的软件。 可能有人会说了,那为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候。这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统。 那么,进程管理软件到底还有存在的价值吗?其实还是有的,在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显着的提高运行速度。但一些小程序,完全可交由系统自己管理。很多朋友还有个疑问,如果不关程序是不是会更耗电?这里也解释一下,android的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态。所以为什么有的程序切出去重新进入,还会到主界面。但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务,服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了。这个在进程管理软件里能看到,名字是service。所以没有带服务的应用在后台是完全不耗电的,没有必要关闭。这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个android的优点呢? 还有一点,为什么android应用看起来那么耗内存?大家知道,android上的应用是java,当然需要虚拟机,而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机。这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存。 至于为什么开了大程序或者开了好几个程序之后切换会变慢,具体分析如下: 已经开启了一个大程序,占用70%内存,如果再想运行一个程序,此时还需要50%的内存,则就需要一个从大程序占用的内存中释放或者压缩的过程,所以表现出来的就是慢一会儿。 已经开启了几个程序共占用内存80%,运行新程序时又需要20%的内存,系统内存因为没见过剩余0的时候,也就是应该剩一部分空闲内存,那么就需要从之前开启的这几个程序中选择一个或者几个来关闭,这一过程也需要耗费系统资源,所以会慢一会儿。也就是说你手动去结束程序的时候,就是替系统在释放内存,就算你不去结束,在需要内存的时候系统也会自动结束程序释放内存。 不在后台运行的程序(没服务的),即使不结束也不会耗电。在后台运行的(有服务的)程序,如一些播放器或实时监控的软件,自然会耗电。这就说明结束进程并不是没用,我们只需要看哪个带服务耗电哪个程序后台一直在运行,看服务就能看出来,这样的软件如果用不到的时候就结束了吧。 以QQ举例,正常的退出,会在进程管理里留下qq的运行过的状态,但不耗电不占 cpu,如果你只是切换出去(按房子键而不是退出)那么自然会耗电,因为程序还在运行,QQ还在线呢。 这里就有个要注意的地方了,虽然房子键和那个返回键都可以将程序切换出去,但是两者的效果差异是很大的,返回键可以视作程序已经退出了,而按房子键,则是将程序切换到了后台来运行,软件并没有退出哦! 以上这些设计都是为了确保了android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现。大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,得不偿失。大家不妨换种观念习惯来使用android系统
⑤ 为什么Android应用异常后会自动重启
就是部分产商优化不够的问题,有些产商在运用异常后引起 系统的不良反应导致重启,死机、。
大部分情况下运用异常是不会出现重启的现象。
⑥ android 怎么捕获app异常闪退的日志
1、通过集成第三方SDK,如网络统计、友盟统计等
2、发版时使用加固工具,他们也会收集错误日志,如360加固
3、在程序中添加程序异常崩溃的捕捉代码,保存到本地文件中。
⑦ android app崩溃了怎么办 如何捕获崩溃日志
登录360加固保官网,360加固保是全球移动应用安全提供商,为应用提供专业的应用加固、崩溃日志、盗版监测等安全服务。
0【360加固保】Android apk加密详细步骤
无需集成第三方崩溃SDK,免去开发成本。上传apk,提交应用加固,勾选“崩溃日志分析”服务,即可使用应用崩溃服务。
3
应用加固成功后,即可在360加固保的“管理中心”页查看应用的崩溃情况。提供的崩溃信息包括:崩溃次数、影响用户数、崩溃率、应用崩溃版本、崩溃的设备、机型等信息,详细的崩溃堆栈信息。
⑧ 如何获得Android的崩溃日志
每个android应用都是由一个Application和多个activity或者server构成.应用启动时,会首先启动Application.在Application的onCreate方法中调用
1Thread.(handler);
就可以捕获导致应用崩溃的错误信息了.
首先应用要有读写sd卡权限