欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Android應(yīng)用中出現(xiàn)crash如何解決-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)Android 應(yīng)用中出現(xiàn)crash如何解決,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

“只有客戶(hù)發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線(xiàn),而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無(wú)止境。

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

Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler(loggingHandler));

如果沒(méi)有這句話(huà),app就不會(huì)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彈窗等)后,最終會(huì)殺死進(jìn)程,這樣你的app就崩潰了。

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

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

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

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

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

  • Thread.setCaughtExceptionPreHandler()覆蓋所有線(xiàn)程,會(huì)在回調(diào)DefaultExceptionHandler之前調(diào)用;

  • Thread.setCaughtExceptionHandler()同樣回覆蓋所有線(xiàn)程,可以在應(yīng)用層被重復(fù)調(diào)用,并且每一次調(diào)用后,都會(huì)覆蓋上一次設(shè)置的DefaultUncaughtExceptionHandler;

  • Thread.currentThread.setUncaughtExceptionHandler(),只可以覆蓋當(dāng)前線(xiàn)程的異常。如果某個(gè)線(xiàn)程存在自定義的UncaughtExceptionHandler,回調(diào)時(shí)會(huì)忽略全局的DefaultUncaughtHandler。


既然話(huà)都說(shuō)到這份上了,就請(qǐng)接下never crash大招吧。

要想不crash,只能讓線(xiàn)程不要拋出exception,唯此別無(wú)他法。如果我們能把一個(gè)線(xiàn)程的所有的操作都使用try-catch進(jìn)行保護(hù),理論上,就能做到app never crash。由于android基于Handler事件驅(qū)動(dòng)的機(jī)制,可以在app啟動(dòng)時(shí),向主線(xiàn)程中的MessageQueue中提交一個(gè)死循環(huán)操作,在這個(gè)死循環(huán)中不斷去poll事件,并且將這個(gè)死循環(huán)進(jìn)行try-catch,這樣所有主線(xiàn)程中的異常都會(huì)被catch住,從而app就再也不會(huì)發(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) {
          //所有主線(xiàn)程中的異常都會(huì)被catch住,從而不會(huì)發(fā)生crash
          Log.e(tag, "catch exception: " + e.message)
        }
      }
    }
  }

有人可能要說(shuō)了,你這樣catch住主線(xiàn)程的異常了,頁(yè)面可能要亂套哇。話(huà)雖如此,但你可以在catch中做業(yè)務(wù)保護(hù)呀。比如,我這里采取的做法是,關(guān)閉棧頂activity。 解決ActivityLifeCycle,維護(hù)一個(gè)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住異常時(shí),

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

看完上述內(nèi)容,你們對(duì)Android 應(yīng)用中出現(xiàn)crash如何解決有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

分享文章:Android應(yīng)用中出現(xiàn)crash如何解決-創(chuàng)新互聯(lián)
當(dāng)前地址:http://aaarwkj.com/article30/iepso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、微信小程序標(biāo)簽優(yōu)化、Google、外貿(mào)建站、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
日韩不卡高清免费在线视频| 青青草免费在线视频蜜臀| 精品国产一区二区三区卡| 亚洲av毛片免费在线观看| 亚洲中文字幕一二区日韩| 亚洲热妇热女久久精品| 欧美香蕉在线观看视频| 国产一级性生活高清在线| 日本亚洲一区二区在线观看| 人妻鲁丝一区二区三区| 视频免费观看网站不卡| 日韩午夜免费一区二区蜜桃| 亚洲av天堂在线观看| 成人色视频免费在线观看| 国产精品一区二区久久蜜桃麻豆| 欧美精品国产欧美精品国产| 久久人妻少妇嫩草av蜜桃综合| 久久精品亚洲欧美激情| 西西美女掰开阴让你看| 日本99精品视频10| 亚洲一区有码在线观看| 白白色成人在线免费视频| 亚洲色图综合在线观看| 久热99在线视频免费观看| 国产一区二区精品久久岳| 日本午夜诱惑在线观看| 在线观看国产自拍精品| 中文字慕日韩精品欧美一区| 中文字幕国产精品经典三级| 91av国产一区二区| 国产亚洲欧美日韩激情在线 | 国产日韩精品免费在线| 国产精品亚洲欧美在线| 中文字幕乱码视频日本| 日韩欧美精品视频一区| 亚洲av一区二区三区| 人妇乱系列中文字幕人妻| 宫部凉花中文字幕在线| 国产69精品久久一级| 一区二区三区国产精品乱码| 蜜桃传媒18传媒在线|