近来发现一个关于SQLiteCursor的问题,多线程操作下产生的异常,偶现。
在Application中操作了Cursor的close()后紧接着又从DBHelper中取了新的引用。然后发广播,到Activity的Receiver中接受后,调用了app.getCursor();取得Application中的Cursor引用,调用了cursor.getCount();
结果出现了一个NullPointer错误:
E/AndroidRuntime(28116): java.lang.NullPointerException E/AndroidRuntime(28116): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144) E/AndroidRuntime(28116): at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) E/AndroidRuntime(28116): at com.letv.signalsourcemanager.MainActivity.handleScanCompleted(MainActivity.java:1728) E/AndroidRuntime(28116): at com.letv.signalsourcemanager.MainActivity.access$1200(MainActivity.java:88) E/AndroidRuntime(28116): at com.letv.signalsourcemanager.MainActivity$10.onReceive(MainActivity.java:2570) E/AndroidRuntime(28116): at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297) E/AndroidRuntime(28116): at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46) E/AndroidRuntime(28116): at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116) E/AndroidRuntime(28116): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(28116): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(28116): at android.app.ActivityThread.main(ActivityThread.java:4777) E/AndroidRuntime(28116): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(28116): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(28116): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) E/AndroidRuntime(28116): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) E/AndroidRuntime(28116): at dalvik.system.NativeStart.main(Native Method) W/ActivityManager( 635): Force finishing activity com.letv.signalsourcemanager/.MainActivity
查看SQLiteCursor源码发现,
@Override public int getCount() { if (mCount == NO_COUNT) { fillWindow(0); } return mCount; } private void fillWindow(int requiredPos) { clearOrCreateWindow(getDatabase().getPath()); if (mCount == NO_COUNT) { int startPos = DatabaseUtils.cursorPickFillWindowStartPosition(requiredPos, 0); mCount = mQuery.fillWindow(mWindow, startPos, requiredPos, true); mCursorWindowCapacity = mWindow.getNumRows(); if (Log.isLoggable(TAG, Log.DEBUG)) { Log.d(TAG, "received count(*) from native_fill_window: " + mCount); } } else { int startPos = DatabaseUtils.cursorPickFillWindowStartPosition(requiredPos, mCursorWindowCapacity); mQuery.fillWindow(mWindow, startPos, requiredPos, false); } }
具体是getCount的时候现判断
mCount == NO_COUNT
实际上此时cursor的count是大于0的,然后进入了fillWindow,然后在
mCursorWindowCapacity = mWindow.getNumRows();
出现了空指针错误。
由于现象是偶现的,所以我就判定跟多线程有关,导致Cursor的问题。
那么就需要加同步锁来解决了。具体方式有很多,此处不赘述。
相关推荐
新文件的档案读写操作 第14章 MFC多线程程序设计 从操作系统层面看线程 三个观念:模块、行程和线程 线程优先级(Priority) 线程调度(Scheduling) Thread Context 从程序设计层面看线程 Worker Threads和UI ...
多线程程序设计实例 第2章 C++的重要性质 类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态...
多线程程序设计实例 第2章 C++的重要性质 类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态...
|--安卓下的多线程断点上传 |--对话框与进度条结合用法 |--屏幕之Activity全屏 |--屏幕之横竖屏切换 |--屏幕之调节屏幕亮度 |--屏幕相关之Display类获取屏幕尺寸和分辨率 |--屏幕适配之ScrollView |--屏幕适配之像素...
而且,该多线程IDE还意味着出现编程错误时不会中止:您在任何时间都可以中断执行或保存您的工作。 易于安装 不同于SQL*Net,无需中间件,也无需数据库对象安装。只需点击安装程序按钮,您就可以开始安装从而使用...
多线程IDE——PL/SQL Developer是一个多线程IDE。这样,当SQL查询、PL/SQL程序、调试会话等正在运行时,您依然可以继续工作。而且,该多线程IDE还意味着出现编程错误时不会中止:您在任何时间都可以中断执行或保存...
2.1.18 MDI窗体——多文档界面 143 2.1.19 MdiChildren属性——获取子窗体的数组 146 2.1.20 MdiParent属性——设置父窗体 147 2.1.21 MinimizeBox属性——是否显示最小化按钮 147 2.1.22 Minimum属性——数字显示框...
使用多个 UTL_FILE_DIR 参数即可指定多个目录。请注意所有用户均可读取或写入 UTL_FILE_DIR 参数中指定的所有文件。 值范围: 任何有效的目录路径。 默认值: 无 plsql_v2_compatibility: 说明: 设置 PL/SQL 兼容级...
2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)…………...
2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)………………...
2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)…………...