2014-09-13 3 views
1

У меня есть фрагмент, где функция создает DatabaseHandler и вызывает функцию внутри объекта:Android getWritableDatabase бросает NullPointerException только иногда

final DatabaseHandler db = new DatabaseHandler(getActivity()); 
String teamName = db.getTeamName(); 

с DatabaseHandler конструктора существа:

Context context; 

public DatabaseHandler(Context contextPassed) { 
    super(contextPassed, DATABASE_NAME, null, DATABASE_VERSION); 
    context = contextPassed; 

} 

Где-то внутри дб .getTeamName() (через другую функцию) У меня есть:

SQLiteDatabase db = this.getWritableDatabase();//exception here! 

Это работает отлично в 99% случаев. Но если приложение некоторое время находилось в фоновом режиме, и я возобновляю его, я получаю исключение NullPointerException. Трудно реплицировать, потому что приложение должно быть в фоновом режиме на века, прежде чем это произойдет. Это заставляет меня думать о сборке мусора? Процесс начинается с намерения трансляции - не уверен, что это актуально. Я не могу отлаживать его, потому что я не могу его воспроизвести, но каждое утро, когда я просыпаюсь, я проверяю его, и он падает. Не очень хороший способ начать день, и это заставляет меня сходить с ума! LogCat:

threadid=1: thread exiting with uncaught exception (group=0x400259f8) 
FATAL EXCEPTION: main 
java.lang.RuntimeException: Error receiving broadcast Intent { act=updateSettingsTeamName } in [email protected] 
    at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:938) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:144) 
    at android.app.ActivityThread.main(ActivityThread.java:4937) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
    at com.gcm.goalpocket.DatabaseHandler.getUserID(DatabaseHandler.java:529) 
    at com.gcm.goalpocket.DatabaseHandler.getTeamName(DatabaseHandler.java:563) 
    at com.gcm.goalpocket.Settings.setTeamName(Settings.java:310) 
    at com.gcm.goalpocket.MainActivity$4.onReceive(MainActivity.java:257) 
+0

Если вам нужна база данных для чтения, используйте getReadableDatabse() только call getWritableDatabase(); когда вам нужно писать данные. –

+0

Я попробую это сейчас - стыдно, что мне не нужно проверять до утра! – Cem

ответ

0

В вещательном приемнике, как указано в вашем onReceive() StackTrace, использовать переданный в Context в вашем контексте вы передаете помощник конструкторы.

Нет гарантии, что активность активна как действительная Context в то время, когда ваш радиоприемник работает.

+0

Спасибо Laalto & Imtiyaz - проснулся сегодня утром без ошибок! – Cem