APP開發(fā)實(shí)戰(zhàn)97-Android異常處理

25 Android異常處理

25.1異常處理基礎(chǔ)

(轉(zhuǎn)自:http://blog.csdn.net/zkw12358/article/details/11097649#)

Java中提供了UncaughtExceptionHandler這個(gè)接口,Android沿用了此接口,通過(guò)實(shí)現(xiàn)此接口,能夠處理線程被一個(gè)無(wú)法捕捉的異常所終止的情況。

ThreadGroup這個(gè)類就是實(shí)現(xiàn)了UncaughtExceptionHandler這個(gè)接口,如果想捕獲異常,可以實(shí)現(xiàn)這個(gè)接口或者繼承ThreadGroup,并重載uncaughtException方法。

在實(shí)現(xiàn)UncaughtExceptionHandler時(shí),必須重載uncaughtException(Threadthread, Throwable ex) ,如果沒(méi)有實(shí)現(xiàn)該接口,也就是沒(méi)有顯示捕捉異常,則ex為空,否則ex不為空,thread 則為出異常的線程。

如下代碼實(shí)現(xiàn)UncaughtExceptionHandler接口,顯示處理線程異常終止的情況:

public?class?UnCeHandler?implements?UncaughtExceptionHandler?{

private?Thread.UncaughtExceptionHandler?mDefaultHandler;

public?static?final?String?TAG?=?"CatchExcep";

CatchExcep?application;

public?UnCeHandler(CatchExcep?application){

//獲取系統(tǒng)默認(rèn)的UncaughtException處理器

mDefaultHandler?=?Thread.getDefaultUncaughtExceptionHandler();

this.application?=?application;

}

@Override

public?void?uncaughtException(Thread?thread,?Throwable?ex)?{

if(!handleException(ex)?&&?mDefaultHandler?!=?null){

//如果用戶沒(méi)有處理則讓系統(tǒng)默認(rèn)的異常處理器來(lái)處理

mDefaultHandler.uncaughtException(thread,?ex);

}else{

try{

Thread.sleep(2000);

}catch?(InterruptedException?e){

Log.e(TAG,?"error?:?",?e);

}

Intent?intent?=?new?Intent(application.getApplicationContext(),?MainActivity.class);

PendingIntent?restartIntent?=?PendingIntent.getActivity(

application.getApplicationContext(),?0,?intent,

Intent.FLAG_ACTIVITY_NEW_TASK);

//退出程序

AlarmManager?mgr?=?(AlarmManager)application.getSystemService(Context.ALARM_SERVICE);

mgr.set(AlarmManager.RTC,?System.currentTimeMillis()?+?1000,

restartIntent);?//?1秒鐘后重啟應(yīng)用

application.finishActivity();

}

}

/**

*?自定義錯(cuò)誤處理,收集錯(cuò)誤信息?發(fā)送錯(cuò)誤報(bào)告等操作均在此完成.

*

*?@param?ex

*?@return?true:如果處理了該異常信息;否則返回false.

*/

private?boolean?handleException(Throwable?ex)?{

if?(ex?==?null)?{

return?false;

}

//使用Toast來(lái)顯示異常信息

new?Thread(){

@Override

public?void?run()?{

Looper.prepare();

Toast.makeText(application.getApplicationContext(),?"很抱歉,程序出現(xiàn)異常,即將退出.",

Toast.LENGTH_SHORT).show();

Looper.loop();

}

}.start();

return?true;

}

}

通過(guò)在androidApplication 這個(gè)全局類中處理異常:

public?class?CatchExcep?extends?Application{

ArrayList?list?=?new?ArrayList();

public?void?init(){

//設(shè)置該CrashHandler為程序的默認(rèn)處理器

UnCeHandler?catchExcep?=?new?UnCeHandler(this);

Thread.setDefaultUncaughtExceptionHandler(catchExcep);

}

/**

*?Activity關(guān)閉時(shí),刪除Activity列表中的Activity對(duì)象*/

public?void?removeActivity(Activity?a){

list.remove(a);

}

/**

*?向Activity列表中添加Activity對(duì)象*/

public?void?addActivity(Activity?a){

list.add(a);

}

/**

*?關(guān)閉Activity列表中的所有Activity*/

public?void?finishActivity(){

for?(Activity?activity?:?list)?{

if?(null?!=?activity)?{

activity.finish();

}

}

//殺死該應(yīng)用進(jìn)程

android.os.Process.killProcess(android.os.Process.myPid());

}

}

測(cè)試代碼:

Button?btn;

TextView?tv;

private?CatchExcep?application;

@Override

protected?void?onCreate(Bundle?savedInstanceState)?{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

btn?=?(Button)findViewById(R.id.btn);

tv?=?(TextView)findViewById(R.id.tv);

application?=?(CatchExcep)getApplication();

application.init();

application.addActivity(this);

btn.setOnClickListener(this);

}

/**

*?人為制造的異常*/

public?void?press(){

new?Thread(new?Runnable()?{

@Override

public?void?run()?{

tv.setText("dfsd");

}

}).start();

}

@Override

public?void?onClick(View?v)?{

press();

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Android Crash說(shuō)明 程序因未捕獲的異常而突然終止, 系統(tǒng)會(huì)調(diào)用處理程序的接口UncaughtExc...
    Mur閱讀 3,186評(píng)論 0 6
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-androi...
    eddy_wiki閱讀 3,380評(píng)論 0 20
  • 2017年5月17日 Kylin_Wu 標(biāo)注(★☆)為考綱明確給出考點(diǎn)(必考) 常見(jiàn)手機(jī)系統(tǒng)(★☆) And...
    Azur_wxj閱讀 1,960評(píng)論 0 10
  • 大家都知道,現(xiàn)在安裝Android系統(tǒng)的手機(jī)版本和設(shè)備千差萬(wàn)別,在模擬器和自己的android手機(jī)上運(yùn)行良好的程序...
    Orz013閱讀 3,874評(píng)論 0 4
  • 簡(jiǎn)單不是一個(gè)開始 需要穿越復(fù)雜的麻煩 簡(jiǎn)單也不是一個(gè)結(jié)果 需要開始時(shí)自由的灑脫 最簡(jiǎn)單的是減法 只牢記一個(gè) 七年之約
    天籟村閱讀 138評(píng)論 0 0

友情鏈接更多精彩內(nèi)容