在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键,当取消的时候,进入到这个函数中,会有一个空指针错误,导致程序崩溃

protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); Bundle extras = intent.getExtras(); switch (requestCode) { case ACTIVITY_CREATE: String title = extras.getString(NotesDbAdapter.KEY_TITLE); String body = extras.getString(NotesDbAdapter.KEY_BODY); mDbHelper.createNote(title, body); fillData(); break; case ACTIVITY_EDIT: Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID); if (rowId != null) { String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE); String editBody = extras.getString(NotesDbAdapter.KEY_BODY); mDbHelper.updateNote(rowId, editTitle, editBody); } fillData(); break; } }

进入这个函数后,intent将为null,在调用他的成员函数时就会出错。

修改这个bug很容易,因为当按取消键,或者esc按钮的时候,其resultcode是RESULT_CANCELED,我们只要加一个判断即可。

修改后的代码如下,

@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (resultCode == RESULT_CANCELED) { return; } Bundle extras = intent.getExtras(); switch (requestCode) { case ACTIVITY_CREATE: String title = extras.getString(NotesDbAdapter.KEY_TITLE); String body = extras.getString(NotesDbAdapter.KEY_BODY); mDbHelper.createNote(title, body); fillData(); break; case ACTIVITY_EDIT: Long rowId = extras.getLong(NotesDbAdapter.KEY_ROWID); if (rowId != null) { String editTitle = extras.getString(NotesDbAdapter.KEY_TITLE); String editBody = extras.getString(NotesDbAdapter.KEY_BODY); mDbHelper.updateNote(rowId, editTitle, editBody); } fillData(); break; } }

经测试后,运行良好。

更多相关文章

  1. Android(安卓)文件操作详解及简单实例
  2. Android(安卓)APIDemos 研读之一:android.graphics.Movie
  3. 【Android】实现全屏、无标题栏效果
  4. Android(安卓)studio使用技巧(二:国际化以及代码重构)
  5. Android全埋点解决方案-认识
  6. Android系统源码阅读(10):Android(安卓)应用程序的消息处理机制
  7. Android源码下载——用git clone实现单个目录下载
  8. Android软件广告屏蔽方法及代码
  9. 箭头函数的基础使用

随机推荐

  1. Android(安卓)极光推送快速接入
  2. Android(安卓)XML解析技术-自eoe
  3. Ubuntu下Android NDK的安装及配置
  4. 修改Android默认的RadioButton样式
  5. Eclipse Android项目导入Android(安卓)St
  6. android studio教程-创建第一个项目Hello
  7. android启动SDK Manager闪退问题
  8. 点评Android(安卓)App埋点总结
  9. http 请求时间
  10. android之横向滚动图