国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android去除煩人的默認閃退Dialog

2019-12-12 06:38:17
字體:
來源:轉載
供稿:網友

安卓應用閃退后總會出現一個“抱歉,App已經停止運行”的彈窗,這樣的用戶體驗并不好。很多大廠的App都去除了這個彈窗,因此本文主要介紹如何去除默認閃退彈窗,以及在閃退時做一些必要的善后工作。

UnCaughtExceptionHandler
UnCaughtExceptionHandler能夠在Thread遇到未catch住的Exception而終止前做一些善后工作。但是它無法阻止線程停止運行,線程最后還是要退出。

 Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {   @Override   public void uncaughtException(Thread thread, Throwable ex) {    System.exit(1);   }  });

去除Dialog
Android系統默認設置了一個UnCaughtExceptionHandler,而彈出閃退彈窗的工作就是在這個handler做的。所以如果要去除彈窗,只要實現一個UnCaughtExceptionHandler并替換掉系統默認的就可以了,代碼如下。

public class App extends Application { @Override public void onCreate() {  super.onCreate();  Thread.setDefaultUncaughtExceptionHandler(new MyUnCaughtExceptionHandler()); } class MyUnCaughtExceptionHandler implements Thread.UncaughtExceptionHandler{  @Override  public void uncaughtException(Thread thread, Throwable ex) {   ex.printStackTrace();   // do some work here  android.os.Process.killProcess(android.os.Process.myPid());   System.exit(1);  } }}

以上的替換UnCaughtExceptionHandler的工作是在Application中統一做的,當然你也可以在每一個Activity中做。對于單個Activity還好,當Activity很多的時候就必需實現一個BaseActivity,在BaseActivity中替換,其它Activity要集成BaseActivity。

必要的善后工作
為了處理閃退,提升用戶體驗,有必要做一些善后工作,主要有幾條羅列如下:

異常上報
可以采用郵件或者通過服務器接口上傳的方式。兩者各有優缺點,郵件方式開發簡單,但需要用戶額外操作,用戶體驗較差。如果用上傳服務器方式,因為在UnCaughtExceptionHandler中不能打開一個新的線程,所以只能同步請求,在網絡情況不好的時候花費時間會較長而阻塞運行。也可能因為網絡原因而上報失敗。當然總體下來還是上傳服務器好一點。具體實現留給讀者。

記錄日志
將閃退信息存儲到文件系統中。不能存到SharedPreferences中,因為打開SP需要使用一個新的線程(Android內部實現),而這在UnCaughtExceptionHandler中,這是不被允許的。

閃退三次清除數據
很多時候是由于后臺返回數據錯誤導致的閃退。如果這些數據被緩存下來,那么用戶即使再次打開還是會發生閃退,這時候就只能通過重裝或者清除數據的方式才能解決閃退問題,用戶體驗十分不好。所以在多次閃退后自動清除緩存數據十分必要。具體實現可以參考我的另一篇博客Android實現多次閃退清除數據。不過該博客中使用的是ACRA,一個對UnCaughtExceptionHandler再次封裝的開源項目,讀者可以將ACRA替換為UnCaughtExceptionHandler來實現。

重新打開App
可以在UnCaughtExceptionHandler中重新打開App或者彈出自定義彈窗。

 class MyUnCaughtExceptionHandler implements Thread.UncaughtExceptionHandler{  @Override  public void uncaughtException(Thread thread, Throwable ex) {   ex.printStackTrace();      Intent intent = new Intent(App.this, MainActivity.class);   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);   App.this.startActivity(intent);   android.os.Process.killProcess(android.os.Process.myPid());   System.exit(1);  } }

注意setFlags這一步是必需的,因為使用的Context是App的Context,所以必需打開一個新的任務隊列,否則打開Activity無法生效,如果你替換Handler是在Activity做的,拿到的Context是Activity的Context,則無需這一步。

注意事項
最主要的注意點我之前已經提到,不要在UnCaughtExceptionHandler中新開一個線程,會拋出異常。

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江源县| 隆昌县| 抚州市| 宁蒗| 乐安县| 临颍县| 佳木斯市| 安平县| 博罗县| 洛川县| 五大连池市| 阳信县| 伊金霍洛旗| 延庆县| 辛集市| 石阡县| 镇巴县| 新干县| 河北省| 麻栗坡县| 毕节市| 白水县| 林芝县| 古丈县| 宁阳县| 东乡族自治县| 靖安县| 聊城市| 云梦县| 岑巩县| 永宁县| 平陆县| 罗山县| 和硕县| 鄯善县| 望谟县| 保山市| 寻甸| 阿克| 隆德县| 加查县|