在Android Activity中捕獲Application Crash

因爲接觸android開發的時間並不久,對於android系統、機制的理解也是隻知其一;不知其二。因此在開發中陸陸續續遇到不少莫名其妙的問題,其中最讓人頭疼的就是application crash。application的crash可能因爲不少的緣由所引發的,有多是由於數據的問題,或者是異步AsyncTask的運用不合理,等等等等,均可能形成application crash。 java

也一直在想如何才能知道application crash,想在application crash的時候作點什麼,一直也沒有找到一個solution。後來在一個偶然的機會用到一個別人的application能夠捕獲到crash,就想撿到了寶同樣。想盡辦法去找到這個application的sourcecode,發現原來很簡單,幾句話就能夠作到。 android

 

1. 在Activity的onCreate方法裏面添加這句話: app

Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler(this)); 異步

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(this));
        
        setContentView(R.layout.main);
        
        click2Crash = (Button)findViewById(R.id.clickToCrash);
        
        click2Crash.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
String text = "aaa";
System.out.print(text.charAt(10));
}});
    }


2. 寫一個本身的MyUncaughtExceptionHandler implementes UncaughtExceptionHandler,實現方法uncaughtException。在這個方法裏面作任何想作的事情,好比說將形成application crash的緣由發送給開發人員。  ide

public class UncaughtExceptionHandler implements
java.lang.Thread.UncaughtExceptionHandler {
private Context con_;
public UncaughtExceptionHandler(Context con){
this.con_ = con;
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
System.err.println(sw);
Intent bugReportIntent = new Intent(con_, BugReportActivity.class);
bugReportIntent.putExtra(BugReportActivity.exceptionMsg, sw.toString());
con_.startActivity(bugReportIntent);

Process.killProcess(Process.myPid());
System.exit(10);
}
}

學習

3. 寫一個本身的Activity,告訴用戶,你須要這個exception信息,讓他Email給開發人員。 this

public class BugReportActivity extends Activity {
public static final String exceptionMsg = "exceptionMsg";

private TextView reportContent;
private Button sendMailBtn;
private Button cancelBtn;

protected void onCreate(Bundle bundle){
super.onCreate(bundle);
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(this));

setContentView(R.layout.bug_report);

reportContent = (TextView)findViewById(R.id.reportContent);
sendMailBtn = (Button)findViewById(R.id.sendMail);
cancelBtn = (Button)findViewById(R.id.cancel);

String sw = getIntent().getStringExtra(exceptionMsg);
reportContent.setText(sw);

initHandler();
}

private void initHandler(){
sendMailBtn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "Email will be sent to our helpdesk.", Toast.LENGTH_LONG).show();
}
});
cancelBtn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
finish();
}
});
}
}

google

一直都是看別人的blog學習東西的,今天第一次發個blog。有什麼很差的地方請你們見諒。:-) spa

 

發現一個GoogleProject專門關注這個Application Crash Report for Android的,簡稱ACRA.你們能夠在下面這個連接上面找到相關內容。 code

http://code.google.com/p/acra/

相關文章
相關標籤/搜索