在android 官方提供的 Notepad tutorial的 Notepadv2Solution這個例子中,我發現有一個bug。
當運行後,新建立一個item,當我們不點擊confirm按鈕,而是選擇取消按鈕,或者 esc鍵的時候,就會報應用程式崩潰的錯誤。
結合android的生命週期原理,我發現是這個代碼中存在一個問題。
在代碼中,其覆蓋了 onActivityResult(int requestCode, int resultCode, Intent intent)這個Activity基類中的函數。
這是 api文檔中關於這個函數的介紹。
Called when an activity you launched exits, giving you the requestCode you
started it with, the resultCode it returned, and any additional data from it.
The resultCode will be RESULT_CANCELED
if the activity explicitly returned that, didn't return any result, or crashed
during its operation.
You will receive this call immediately before onResume() when your activity
is re-starting.
Parameters
| requestCode |
The integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from. |
| resultCode |
The integer result code returned by the child activity through its setResult(). |
| data |
An Intent, which can return result data to the caller (various data can be attached to Intent "extras")。 |
在這個官方提供的代碼中,其覆蓋了基類中這個函數,但是其中並沒有處理取消,或者esc鍵,當取消的時候,進入到這個函數中,會有一個null 指標錯誤,導致程式崩潰
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {<br /> super.onActivityResult(requestCode, resultCode, intent);<br />Bundle extras = intent.getExtras();<br />switch (requestCode) {<br />case ACTIVITY_CREATE:<br />String title = extras.getString(NotesDbAdapter.KEY_TITLE);<br />String body = extras.getString(NotesDbAdapter.KEY_BODY);<br />mDbHelper.createNote(title, body);<br />fillData();<br />break;<br />case ACTIVITY_EDIT:<br />Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);<br />if (rowId != null) {<br />String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);<br />String editBody = extras.getString(NotesDbAdapter.KEY_BODY);<br />mDbHelper.updateNote(rowId, editTitle, editBody);<br />}<br />fillData();<br />break;<br />}<br />}
進入這個函數後,intent將為null,在調用他的成員函數時就會出錯。
修改這個bug很容易,因為當按取消鍵,或者esc按鈕的時候,其resultcode是RESULT_CANCELED,我們只要加一個判斷即可。
修改後的代碼如下,
@Override<br /> protected void onActivityResult(int requestCode, int resultCode, Intent intent) {<br /> super.onActivityResult(requestCode, resultCode, intent);<br />if (resultCode == RESULT_CANCELED) {<br />return;<br />}</p><p>Bundle extras = intent.getExtras();<br />switch (requestCode) {<br />case ACTIVITY_CREATE:<br />String title = extras.getString(NotesDbAdapter.KEY_TITLE);<br />String body = extras.getString(NotesDbAdapter.KEY_BODY);<br />mDbHelper.createNote(title, body);<br />fillData();<br />break;<br />case ACTIVITY_EDIT:<br />Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID);<br />if (rowId != null) {<br />String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE);<br />String editBody = extras.getString(NotesDbAdapter.KEY_BODY);<br />mDbHelper.updateNote(rowId, editTitle, editBody);<br />}<br />fillData();<br />break;<br />}<br />}
經測試後,運行良好。