在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 studio使用技巧(二:国际化以及代码重构)
  3. Android的反编译和代码混淆
  4. 在Android上实现HttpServer的示例代码
  5. Android WebView 调用React Js 代码
  6. android recover 系统代码分析 -- 选择进入
  7. android源代码的利用
  8. Android的按钮监听事件&自定义回调函数
  9. Android自定义字体样式Typeface的三种技术方案:Java代码的setType

随机推荐

  1. Android(安卓)debug 问题集合
  2. Android使用SurfaceView播放视频,可以自适
  3. Android腾讯微薄客户端开发七:图片加圆角
  4. android中VideoView无法播放此视频
  5. Android(安卓)UI 之 ProgressBar、Progre
  6. android 设置控件 圆角
  7. Android之SharedPreferences数据保存
  8. Ubuntu 装 Courier New字体
  9. centos7中安装Android(安卓)SDK的方法步
  10. android中使用svg图标