Android getWritableDatabase генерирует исключение NullPointerException только иногда

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

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;

}

Где-то внутри db.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 com.gcm.goalpocket.MainActivity$4@4634a608
    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)

1 ответ

Решение

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

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

Другие вопросы по тегам