`
dingran
  • 浏览: 371997 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Cursor多线程操作下的异常

 
阅读更多

       近来发现一个关于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的问题。

 

   那么就需要加同步锁来解决了。具体方式有很多,此处不赘述。

 

 

分享到:
评论

相关推荐

    深入浅出MFC【侯捷】

    新文件的档案读写操作 第14章 MFC多线程程序设计 从操作系统层面看线程 三个观念:模块、行程和线程 线程优先级(Priority) 线程调度(Scheduling) Thread Context 从程序设计层面看线程 Worker Threads和UI ...

    深入浅出MFC 2e

    多线程程序设计实例 第2章 C++的重要性质 类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态...

    侯捷- -深入浅出MFC

    多线程程序设计实例 第2章 C++的重要性质 类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--安卓下的多线程断点上传 |--对话框与进度条结合用法 |--屏幕之Activity全屏 |--屏幕之横竖屏切换 |--屏幕之调节屏幕亮度 |--屏幕相关之Display类获取屏幕尺寸和分辨率 |--屏幕适配之ScrollView |--屏幕适配之像素...

    PL/SQL Developer8.04官网程序_keygen_汉化

    而且,该多线程IDE还意味着出现编程错误时不会中止:您在任何时间都可以中断执行或保存您的工作。 易于安装  不同于SQL*Net,无需中间件,也无需数据库对象安装。只需点击安装程序按钮,您就可以开始安装从而使用...

    PLSQLDeveloper下载

    多线程IDE——PL/SQL Developer是一个多线程IDE。这样,当SQL查询、PL/SQL程序、调试会话等正在运行时,您依然可以继续工作。而且,该多线程IDE还意味着出现编程错误时不会中止:您在任何时间都可以中断执行或保存...

    C#全能速查宝典

    2.1.18 MDI窗体——多文档界面 143 2.1.19 MdiChildren属性——获取子窗体的数组 146 2.1.20 MdiParent属性——设置父窗体 147 2.1.21 MinimizeBox属性——是否显示最小化按钮 147 2.1.22 Minimum属性——数字显示框...

    Oracle9i的init.ora参数中文说明

    使用多个 UTL_FILE_DIR 参数即可指定多个目录。请注意所有用户均可读取或写入 UTL_FILE_DIR 参数中指定的所有文件。 值范围: 任何有效的目录路径。 默认值: 无 plsql_v2_compatibility: 说明: 设置 PL/SQL 兼容级...

    (推荐)Win32 API大全

    2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)…………...

    windows api大全 chm版

    2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)………………...

    新编Windows API 参考大全(CHM 中文版)

    2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)…………...

Global site tag (gtag.js) - Google Analytics