一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android開發(fā)經(jīng)驗我們要友好的告訴用戶程序要崩潰了

 花荊 2015-05-28

Android開發(fā)經(jīng)驗我們要友好的告訴用戶程序要崩潰了

作者:  發(fā)布日期:2014-11-03 21:27:38
0
Tag標簽:經(jīng)驗  程序  用戶  
  •  

    雖然我們的程序在正式上線之前,都會經(jīng)過嚴格的測試,從而保證程序的健壯性和良好的用戶體驗,但是,一個人的測試或者是幾個人的測試團隊,都不能和上萬甚至數(shù)十萬的用戶相比。因此,前期剛上線的程序在用戶手里被玩崩了,也是很常見的事,但是,如果我們不做特殊處理,系統(tǒng)自帶的程序崩潰提示真的太嚇人了,用戶看到之后會不知所措,因此,我們需要一個解決方案,就是在程序即將崩潰的時候,給用戶一個更加友好的提示,來告訴他,程序馬上要崩潰了。

    就像是下面這樣:

    \

    這樣是不是更加友好一點呢?

    下面講解如何實現(xiàn)。

    如果要實現(xiàn)這種功能,我們需要關注的是Thread類里面的一個接口,UncaughtExceptionHandler,還有一個設置Thread.setDefaultUncaughtExceptionHandler(),這兩個東西到底是干嘛的呢?

    UncaughtExceptionHandler 這個接口是當Thread因為未被捕獲的異常而要被終止的時候,會被調(diào)用的回調(diào)接口。

    而Thread.setDefaultUncaughtExceptionHandler()這個方法,則是設置當線程由于未捕獲到異常而突然終止,并且沒有為該線程定義其他處理程序時所調(diào)用的默認處理程序。

    因此,如果我們想自己處理程序要崩潰時的處理邏輯,我們只需要實現(xiàn)UncaughtExceptionHandler接口,并調(diào)用Thread.setDefaultUncaughtExceptionHandler()設置即可。

    下面是示例代碼

    首先,先給出上面效果圖中的Activity的代碼

     

    01.package com.example.exceptiondemo;
    02. 
    03.import android.app.Activity;
    04.import android.os.Bundle;
    05.import android.view.View;
    06. 
    07.public class MainActivity extends Activity {
    08. 
    09.@Override
    10.protected void onCreate(Bundle savedInstanceState) {
    11.super.onCreate(savedInstanceState);
    12.setContentView(R.layout.activity_main);
    13.// 注冊默認的未捕捉異常處理類
    14.Thread.setDefaultUncaughtExceptionHandler(AppException
    15..getAppExceptionHandler());
    16.AppManager.getAppManager().addActivity(this);
    17. 
    18.}
    19. 
    20.public void btn(View view) {
    21.// 除零錯誤,程序會崩潰
    22.int c = 1 / 0;
    23.}
    24. 
    25.}

    在這段代碼里面,我們故意寫了一個會出現(xiàn)異常的操作,除零,因此只要點擊按鈕,程序就會崩潰。

     

    下面,我們要自己實現(xiàn)接口,這里,我繼承了Exception類。

     

    001.package com.example.exceptiondemo;
    002. 
    003.import java.lang.Thread.UncaughtExceptionHandler;
    004. 
    005.import android.app.Activity;
    006.import android.app.AlertDialog;
    007.import android.content.DialogInterface;
    008.import android.content.DialogInterface.OnClickListener;
    009.import android.os.Looper;
    010.import android.widget.Toast;
    011. 
    012./**
    013.*
    014.* @ClassName: com.example.exceptiondemo.AppException
    015.* @Description: 應用程序異常類:用于捕獲異常
    016.* @author zhaokaiqiang
    017.* @date 2014-11-2 下午10:06:49
    018.*
    019.*/
    020. 
    021.public class AppException extends Exception implements UncaughtExceptionHandler {
    022. 
    023.private static final long serialVersionUID = -6262909398048670705L;
    024. 
    025.private String message;
    026. 
    027.private Thread.UncaughtExceptionHandler mDefaultHandler;
    028. 
    029.private AppException() {
    030.super();
    031.this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
    032.}
    033. 
    034.public AppException(String message, Exception excp) {
    035.super(message, excp);
    036.this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
    037.}
    038. 
    039.public String getMessage() {
    040.return message;
    041.}
    042. 
    043.public void setMessage(String message) {
    044.this.message = message;
    045.}
    046. 
    047./**
    048.* 獲取APP異常崩潰處理對象
    049.*
    050.* @param context
    051.* @return
    052.*/
    053.public static AppException getAppExceptionHandler() {
    054.return new AppException();
    055.}
    056. 
    057.@Override
    058.public void uncaughtException(Thread thread, Throwable ex) {
    059. 
    060.if (!handleException(ex) && mDefaultHandler != null) {
    061.mDefaultHandler.uncaughtException(thread, ex);
    062.}
    063. 
    064.}
    065. 
    066./**
    067.* 自定義異常處理
    068.*
    069.* @param ex
    070.* @return true:處理了該異常信息;否則返回false
    071.*/
    072.private boolean handleException(Throwable ex) {
    073.if (ex == null) {
    074.return false;
    075.}
    076. 
    077.final Activity activity = AppManager.getAppManager().currentActivity();
    078. 
    079.if (activity == null) {
    080.return false;
    081.}
    082. 
    083.new Thread() {
    084.@Override
    085.public void run() {
    086.Looper.prepare();
    087.Toast.makeText(activity, "程序要崩了", Toast.LENGTH_SHORT).show();
    088.new AlertDialog.Builder(activity).setTitle("提示")
    089..setCancelable(false).setMessage("親,程序馬上崩潰了...")
    090..setNeutralButton("沒關系", new OnClickListener() {
    091.@Override
    092.public void onClick(DialogInterface dialog,
    093.int which) {
    094.AppManager.getAppManager().exitApp(activity);
    095.}
    096.}).create().show();
    097.Looper.loop();
    098.}
    099.}.start();
    100. 
    101.return true;
    102.}
    103. 
    104.}

    實現(xiàn)借口之后,我們需要在uncaughtException()方法里面處理自己的邏輯,我在這里面彈出對話框提示用戶程序崩潰,這樣,就比較友好一些。在代碼里面的AppManager類是一個Activity的管理類,下面是代碼

     

     

    001.package com.example.exceptiondemo;
    002. 
    003.import java.util.Stack;
    004. 
    005.import android.app.Activity;
    006.import android.app.ActivityManager;
    007.import android.content.Context;
    008. 
    009./**
    010.*
    011.* @ClassName: net.oschina.app.AppManager
    012.* @Description: Activity管理類:用于管理Activity和退出程序
    013.* @author zhaokaiqiang
    014.* @date 2014-11-2 上午11:27:55
    015.*
    016.*/
    017.public class AppManager {
    018. 
    019.private static Stack<Activity> activityStack;
    020.private static AppManager instance;
    021. 
    022.private AppManager() {
    023.}
    024. 
    025./**
    026.* 單一實例
    027.*/
    028.public static AppManager getAppManager() {
    029.if (instance == null) {
    030.instance = new AppManager();
    031.}
    032.return instance;
    033.}
    034. 
    035./**
    036.* 添加Activity到堆棧
    037.*/
    038.public void addActivity(Activity activity) {
    039.if (activityStack == null) {
    040.activityStack = new Stack<Activity>();
    041.}
    042.activityStack.add(activity);
    043.}
    044. 
    045./**
    046.* 獲取當前Activity(堆棧中最后一個壓入的)
    047.*/
    048.public Activity currentActivity() {
    049.Activity activity = activityStack.lastElement();
    050.return activity;
    051.}
    052. 
    053./**
    054.* 結束當前Activity(堆棧中最后一個壓入的)
    055.*/
    056.public void finishActivity() {
    057.Activity activity = activityStack.lastElement();
    058.finishActivity(activity);
    059.}
    060. 
    061./**
    062.* 結束指定的Activity
    063.*/
    064.public void finishActivity(Activity activity) {
    065.if (activity != null) {
    066.activityStack.remove(activity);
    067.activity.finish();
    068.activity = null;
    069.}
    070.}
    071. 
    072./**
    073.* 結束指定類名的Activity
    074.*/
    075.public void finishActivity(Class<?> cls) {
    076.for (Activity activity : activityStack) {
    077.if (activity.getClass().equals(cls)) {
    078.finishActivity(activity);
    079.}
    080.}
    081.}
    082. 
    083./**
    084.* 結束所有Activity
    085.*/
    086.public void finishAllActivity() {
    087.for (int i = 0, size = activityStack.size(); i < size; i++) {
    088.if (null != activityStack.get(i)) {
    089.activityStack.get(i).finish();
    090.}
    091.}
    092.activityStack.clear();
    093.}
    094. 
    095./**
    096.* 退出應用程序
    097.*/
    098.public void exitApp(Context context) {
    099.try {
    100.finishAllActivity();
    101.ActivityManager activityMgr = (ActivityManager) context
    102..getSystemService(Context.ACTIVITY_SERVICE);
    103.activityMgr.killBackgroundProcesses(context.getPackageName());
    104.System.exit(0);
    105.} catch (Exception e) {
    106.}
    107.}
    108.}

    Demo下載地址:https://github.com/ZhaoKaiQiang/ExceptionDemo

    出處:http://blog.csdn.net/zhaokaiqiang1992

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    五月婷婷缴情七月丁香| 麻豆一区二区三区在线免费| 欧美日韩国产成人高潮| 丰满人妻一二三区av| 国产色一区二区三区精品视频| 五月婷婷欧美中文字幕| 91亚洲国产成人久久精品麻豆| 国产精品午夜一区二区三区| 国产福利一区二区久久| 少妇一区二区三区精品| 在线观看视频国产你懂的| 欧美日韩在线第一页日韩| 亚洲精品日韩欧美精品| 欧美日不卡无在线一区| 亚洲精品熟女国产多毛| 日本乱论一区二区三区| 欧美日韩国产午夜福利| 99久久精品午夜一区| 美女被后入福利在线观看| 国产一级内片内射免费看| 91亚洲国产成人久久| 最近中文字幕高清中文字幕无| 国产又粗又硬又长又爽的剧情| 亚洲专区中文字幕在线| 欧美成人国产精品高清| 亚洲精品欧美精品日韩精品| 久草国产精品一区二区| 日本精品中文字幕人妻| 亚洲第一香蕉视频在线| 日韩一区二区三区在线日| 久久香蕉综合网精品视频| 精品al亚洲麻豆一区| 国产午夜福利一区二区| 黄片美女在线免费观看| 伊人欧美一区二区三区| 国产精品欧美在线观看| 亚洲欧洲一区二区中文字幕| 亚洲国产精品无遮挡羞羞| 亚洲中文字幕剧情在线播放| 日本高清加勒比免费在线| 五月婷婷欧美中文字幕|