【发布时间】:2014-04-01 16:39:53
【问题描述】:
在我的应用程序中,有很多数据库操作,所以我创建了很多游标来检索数据,并且异步任务中使用的游标也很少。现在我的问题是在哪里关闭游标和数据库。
当我在异步操作后关闭onCreate 中的游标时,我得到Null Pointer Exception,如果我在onPause 中关闭,我仍然得到Null pointer exception,所以我已经关闭了@987654326 中的游标和数据库@。
现在我很困惑这种方法是否正确。我想了解在活动中关闭游标和数据库而不影响数据库操作的最佳方法。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stockdetail);
//Helptext.setVisibility(View.INVISIBLE);
Declerations();
d=Database.getInstance(getApplicationContext()).getWritableDatabase();
new popdailydata().execute();
// Above is async task so I have closed after above statement, but if I close cursor getting Null pointer exception
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
selectdate.close();
Database.getInstance(getApplicationContext()).close();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
//selectdate.close(); --- At this point also I am getting nullpointer exception
Database.getInstance(getApplicationContext()).close();
}
04-01 17:03:48.045: D/dalvikvm(1288): Late-enabling CheckJNI
04-01 17:03:50.021: D/libEGL(1288): loaded /system/lib/egl/libEGL_genymotion.so
04-01 17:03:50.113: D/(1288): HostConnection::get() New Host Connection established 0xb90bb5c8, tid 1288
04-01 17:03:50.177: D/libEGL(1288): loaded /system/lib/egl/libGLESv1_CM_genymotion.so
04-01 17:03:50.181: D/libEGL(1288): loaded /system/lib/egl/libGLESv2_genymotion.so
04-01 17:03:50.773: W/EGL_genymotion(1288): eglSurfaceAttrib not implemented
04-01 17:03:50.797: E/OpenGLRenderer(1288): Getting MAX_TEXTURE_SIZE from GradienCache
04-01 17:03:50.861: E/OpenGLRenderer(1288): Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
04-01 17:03:50.865: D/OpenGLRenderer(1288): Enabling debug mode 0
04-01 17:03:54.645: D/dalvikvm(1288): GC_FOR_ALLOC freed 102K, 1% free 16948K/17072K, paused 89ms, total 96ms
04-01 17:03:54.709: D/AndroidRuntime(1288): Shutting down VM
04-01 17:03:54.725: W/dalvikvm(1288): threadid=1: thread exiting with uncaught exception (group=0xa4c45648)
04-01 17:03:54.745: E/AndroidRuntime(1288): FATAL EXCEPTION: main
04-01 17:03:54.745: E/AndroidRuntime(1288): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.portfoliomanager/com.example.StockDirector.stockmanager}: java.lang.NullPointerException
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.os.Handler.dispatchMessage(Handler.java:99)
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.os.Looper.loop(Looper.java:137)
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.app.ActivityThread.main(ActivityThread.java:5103)
04-01 17:03:54.745: E/AndroidRuntime(1288): at java.lang.reflect.Method.invokeNative(Native Method)
04-01 17:03:54.745: E/AndroidRuntime(1288): at java.lang.reflect.Method.invoke(Method.java:525)
04-01 17:03:54.745: E/AndroidRuntime(1288): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
04-01 17:03:54.745: E/AndroidRuntime(1288): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-01 17:03:54.745: E/AndroidRuntime(1288): at dalvik.system.NativeStart.main(Native Method)
04-01 17:03:54.745: E/AndroidRuntime(1288): Caused by: java.lang.NullPointerException
04-01 17:03:54.745: E/AndroidRuntime(1288): at com.example.StockDirector.stockmanager.onCreate(stockmanager.java:81)
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.app.Activity.performCreate(Activity.java:5133)
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-01 17:03:54.745: E/AndroidRuntime(1288): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
04-01 17:03:54.745: E/AndroidRuntime(1288): ... 11 more
04-01 17:03:57.889: I/Process(1288): Sending signal. PID: 1288 SIG: 9
【问题讨论】:
-
您没有显示您使用
Cursor的内容,也没有显示显示 NPE 的 logcat 输出。Cursor必须在任何需要它的应用程序组件的生命周期内保持打开状态。例如,如果您将其与SimpleCursorAdapter一起使用来填充ListView,则在不再使用ListView和SimpleCursorAdapter之前,您无法关闭Cursor。 -
@Squonk 感谢您的回答,并为没有提供 logcat 表示歉意...用 logcat 编辑了我的问题。请指教
-
这仍然不能真正解释您如何使用
Cursor。您表明您正在调用AsyncTask,但不是AsyncTask对检索到的数据所做的事情。 -
@g2o:请记住:Tiny, trivial edits are discouraged - try to make the post significantly better when you edit, correcting all problems that you observe. 所以不要将
cusor替换为cursor,修复每个问题都像我做的那样。
标签: android android-sqlite android-cursoradapter