电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Android app會crash的原因及解決方法

瀏覽:32日期:2022-09-21 10:48:38

android main入口的commonInit()方法內(nèi)處,有這么一句話,

Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler(loggingHandler));

如果沒有這句話,app就不會crash。不信,你往里面看,

public KillApplicationHandler(LoggingHandler loggingHandler) { @Override public void uncaughtException(Thread t, Throwable e) { //捕獲到異常 try { ...... //打印crash日志,展示崩潰彈窗等 // Bring up crash dialog, wait for it to be dismissed ActivityManager.getService().handleApplicationCrash( mApplicationObject, new ApplicationErrorReport.ParcelableCrashInfo(e)); } catch (Throwable t2) {.... } finally {// Try everything to make sure this process goes away.Process.killProcess(Process.myPid());//殺死進(jìn)程System.exit(10); } } }

當(dāng)異常KillApplicationHandler捕獲到異常,進(jìn)行完一系列處理(主要是打印crash日志,通知AMS展示crash彈窗等)后,最終會殺死進(jìn)程,這樣你的app就崩潰了。

既然都崩潰了,自定義異常捕獲器來屏蔽crash真的可行嗎?

肯定有人會說,自定義一個異常捕獲器,來覆蓋掉系統(tǒng)的KillApplicationHandler,然后在捕獲到異常后,不殺進(jìn)程,app就不會崩潰了,就像下面這樣,

class MainApplication : Application() { override fun onCreate() { super.onCreate() Thread.setDefaultUncaughtExceptionHandler { _, e -> //捕獲到異常,只打印日志,不殺進(jìn)程 Log.e('MainApplication', '${Thread.currentThread().name} 捕獲到異常:${e.message}') } }}

這其實只是隔壁老王的思路,雖然確實防護(hù)住子線程的crash,但是當(dāng)主線程出現(xiàn)異常時,app還是無法正常運(yùn)行。這是因為,當(dāng)UncaughtExceptionHandler捕獲到線程拋出異常的時候,線程在執(zhí)行完uncaughtException()中的處理后,就無法繼續(xù)存活了。如果拋異常的線程是主線程,那就意味著主線程會死掉,這時你即便不殺進(jìn)程,進(jìn)程活著也沒有任何意義了,app還是會停止運(yùn)行。

把a(bǔ)ndroid異常捕獲機(jī)制在梳理一下,熟悉的同學(xué)可以跳過,直接進(jìn)入下一節(jié)。

Thread.setCaughtExceptionPreHandler()覆蓋所有線程,會在回調(diào)DefaultExceptionHandler之前調(diào)用; Thread.setCaughtExceptionHandler()同樣回覆蓋所有線程,可以在應(yīng)用層被重復(fù)調(diào)用,并且每一次調(diào)用后,都會覆蓋上一次設(shè)置的DefaultUncaughtExceptionHandler; Thread.currentThread.setUncaughtExceptionHandler(),只可以覆蓋當(dāng)前線程的異常。如果某個線程存在自定義的UncaughtExceptionHandler,回調(diào)時會忽略全局的DefaultUncaughtHandler。 既然話都說到這份上了,就請接下never crash大招吧。

要想不crash,只能讓線程不要拋出exception,唯此別無他法。如果我們能把一個線程的所有的操作都使用try-catch進(jìn)行保護(hù),理論上,就能做到app never crash。由于android基于Handler事件驅(qū)動的機(jī)制,可以在app啟動時,向主線程中的MessageQueue中提交一個死循環(huán)操作,在這個死循環(huán)中不斷去poll事件,并且將這個死循環(huán)進(jìn)行try-catch,這樣所有主線程中的異常都會被catch住,從而app就再也不會發(fā)生crash。

private fun openCrashProtected() { Log.d(tag, 'openCrashProtected') Handler(Looper.getMainLooper()).post { while (true) {try { Looper.loop() Log.d(tag, 'main looper execute loop')} catch (e: Throwable) { //所有主線程中的異常都會被catch住,從而不會發(fā)生crash Log.e(tag, 'catch exception: ' + e.message)} } } }

有人可能要說了,你這樣catch住主線程的異常了,頁面可能要亂套哇。話雖如此,但你可以在catch中做業(yè)務(wù)保護(hù)呀。比如,我這里采取的做法是,關(guān)閉棧頂activity。 解決ActivityLifeCycle,維護(hù)一個Activity棧,

private fun registerLifeCycle() { registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {ActivityStack.Instance().push(activity) } override fun onActivityResumed(activity: Activity) { } override fun onActivityStarted(activity: Activity) { } override fun onActivityPaused(activity: Activity) { } override fun onActivityDestroyed(activity: Activity) {ActivityStack.Instance().pop(activity) } override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { } override fun onActivityStopped(activity: Activity) { } }) }

然后當(dāng)catch住異常時,

//主線程出現(xiàn)異常,關(guān)閉棧頂activityActivityStack.Instance().curr()?.finish()github代碼

最后奉上github倉庫代碼,請笑納。

以上就是Android app會crash的原因及解決方法的詳細(xì)內(nèi)容,更多關(guān)于Android app crash的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 小程序开发公司-小程序制作-微信小程序开发-小程序定制-咏熠软件 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 河南中专学校|职高|技校招生-河南中职中专网 | 洛阳装修公司-洛阳整装一站式品牌-福尚云宅装饰 | 标准光源箱|对色灯箱|色差仪|光泽度仪|涂层测厚仪_HRC大品牌生产厂家 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | ?水马注水围挡_塑料注水围挡_防撞桶-常州瑞轩水马注水围挡有限公司 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 上海皓越真空设备有限公司官网-真空炉-真空热压烧结炉-sps放电等离子烧结炉 | wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 煤机配件厂家_刮板机配件_链轮轴组_河南双志机械设备有限公司 | 对辊破碎机_四辊破碎机_双齿辊破碎机_华盛铭重工 | 电车线(用于供电给电车的输电线路)-百科 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 葡萄酒灌装机-食用油灌装机-液体肥灌装设备厂家_青州惠联灌装机械 | 广东之窗网| 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 安驭邦官网-双向万能直角铣头,加工中心侧铣头,角度头[厂家直销] 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 众能联合-提供高空车_升降机_吊车_挖机等一站工程设备租赁 | 耐磨陶瓷,耐磨陶瓷管道_厂家-淄博拓创陶瓷科技 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 高博医疗集团上海阿特蒙医院 | ICP备案查询_APP备案查询_小程序备案查询 - 备案巴巴 | 南京和瑞包装有限公司| 400电话_400电话申请_866元/年_【400电话官方业务办理】-俏号网 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 耐压仪-高压耐压仪|徐吉电气 |