Fix one bug in Android 官方提供的例子

來源:互聯網
上載者:User

在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 />} 

 

經測試後,運行良好。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.