【Android開發經驗】我們要友好的告訴使用者,程式要崩潰了

來源:互聯網
上載者:User

標籤:tracking   import   否則   start   make      undle   .sh   finish   

? ? 轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992

? ? 儘管我們的程式在正式上線之前,都會經過嚴格的測試。從而保證程式的健壯性和良好的使用者體驗,可是,一個人的測試或者是幾個人的測試團隊,都不能和上萬甚至數十萬的使用者相比。因此。前期剛上線的程式在使用者手裡被玩崩了,也是非經常見的事,可是。假設我們不做特殊處理。系統內建的程式崩潰提示真的太嚇人了,使用者看到之後會不知所措。因此,我們須要一個解決方式。就是在程式即將崩潰的時候。給使用者一個更加友好的提示。來告訴他,程式立即要崩潰了。

? ? 就像是以下這樣:



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

? ? 以下解說怎樣實現。

? ? ?假設要實現這樣的功能。我們須要關注的是Thread類裡面的一個介面,UncaughtExceptionHandler,另一個設定Thread.setDefaultUncaughtExceptionHandler(),這兩個東西究竟是幹嘛的呢?

? ??UncaughtExceptionHandler 這個介面是當Thread由於未被捕獲的異常而要被終止的時候。會被調用的回調介面。

? ? 而Thread.setDefaultUncaughtExceptionHandler()這種方法,則是設定當線程由於未捕獲到異常而突然終止,而且沒有為該線程定義其它處理常式時所調用的預設處理常式。

? ? 因此,假設我們想自己處理常式要崩潰時的處理邏輯,我們僅僅須要實現UncaughtExceptionHandler介面,並調用Thread.setDefaultUncaughtExceptionHandler()設定就可以。

? ? 以下是示範範例代碼

? ? 首先。先給出上面中的Activity的代碼

package com.example.exceptiondemo;import android.app.Activity;import android.os.Bundle;import android.view.View;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 注冊預設的未捕捉異常處理類Thread.setDefaultUncaughtExceptionHandler(AppException.getAppExceptionHandler());AppManager.getAppManager().addActivity(this);}public void btn(View view) {// 除零錯誤,程式會崩潰int c = 1 / 0;}}

? ? 在這段代碼裡面,我們有益寫了一個會出現異常的操作,除零。因此僅僅要點擊button。程式就會崩潰。

? ? 以下,我們要自己實現介面。這裡,我繼承了Exception類。

package com.example.exceptiondemo;import java.lang.Thread.UncaughtExceptionHandler;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.os.Looper;import android.widget.Toast;/** *  * @ClassName: com.example.exceptiondemo.AppException * @Description: 應用程式異常類:用於捕獲異常 * @author zhaokaiqiang * @date 2014-11-2 下午10:06:49 *  */public class AppException extends Exception implements UncaughtExceptionHandler {private static final long serialVersionUID = -6262909398048670705L;private String message;private Thread.UncaughtExceptionHandler mDefaultHandler;private AppException() {super();this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();}public AppException(String message, Exception excp) {super(message, excp);this.mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}/** * 擷取APP異常崩潰處理對象 *  * @param context * @return */public static AppException getAppExceptionHandler() {return new AppException();}@Overridepublic void uncaughtException(Thread thread, Throwable ex) {if (!handleException(ex) && mDefaultHandler != null) {mDefaultHandler.uncaughtException(thread, ex);}}/** * 自己定義異常處理 *  * @param ex * @return true:處理了該異常資訊;否則返回false */private boolean handleException(Throwable ex) {if (ex == null) {return false;}final Activity activity = AppManager.getAppManager().currentActivity();if (activity == null) {return false;}new Thread() {@Overridepublic void run() {Looper.prepare();Toast.makeText(activity, "程式要崩了", Toast.LENGTH_SHORT).show();new AlertDialog.Builder(activity).setTitle("提示").setCancelable(false).setMessage("親。程式立即崩潰了...").setNeutralButton("沒關係", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {AppManager.getAppManager().exitApp(activity);}}).create().show();Looper.loop();}}.start();return true;}}

? ? 實現借口之後。我們須要在uncaughtException()方法裡面處理自己的邏輯,我在這裡面彈出對話方塊提示使用者程式崩潰,這樣。就比較友好一些。在代碼裡面的AppManager類是一個Activity的管理類。以下是代碼

package com.example.exceptiondemo;import java.util.Stack;import android.app.Activity;import android.app.ActivityManager;import android.content.Context;/** *  * @ClassName: net.oschina.app.AppManager * @Description: Activity管理類:用於管理Activity和退出程式 * @author zhaokaiqiang * @date 2014-11-2 上午11:27:55 *  */public class AppManager {private static Stack<Activity> activityStack;private static AppManager instance;private AppManager() {}/** * 單一執行個體 */public static AppManager getAppManager() {if (instance == null) {instance = new AppManager();}return instance;}/** * 加入Activity到堆棧 */public void addActivity(Activity activity) {if (activityStack == null) {activityStack = new Stack<Activity>();}activityStack.add(activity);}/** * 擷取當前Activity(堆棧中最後一個壓入的) */public Activity currentActivity() {Activity activity = activityStack.lastElement();return activity;}/** * 結束當前Activity(堆棧中最後一個壓入的) */public void finishActivity() {Activity activity = activityStack.lastElement();finishActivity(activity);}/** * 結束指定的Activity */public void finishActivity(Activity activity) {if (activity != null) {activityStack.remove(activity);activity.finish();activity = null;}}/** * 結束指定類名的Activity */public void finishActivity(Class<?> cls) {for (Activity activity : activityStack) {if (activity.getClass().equals(cls)) {finishActivity(activity);}}}/** * 結束全部Activity */public void finishAllActivity() {for (int i = 0, size = activityStack.size(); i < size; i++) {if (null != activityStack.get(i)) {activityStack.get(i).finish();}}activityStack.clear();}/** * 退出應用程式 */public void exitApp(Context context) {try {finishAllActivity();ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);activityMgr.killBackgroundProcesses(context.getPackageName());System.exit(0);} catch (Exception e) {}}}

? ? Demo:https://github.com/ZhaoKaiQiang/ExceptionDemo

【Android開發經驗】我們要友好的告訴使用者,程式要崩潰了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.