2010-11-18 8 views
1

J'ai créé un programme, avec un service - le service est "START_STICKY". Donc, quand je ferme le programme (j'utilise Advanced Task Killer, pour tuer des programmes) le service redémarre automatiquement, mais cela pose un problème parce que je reçois une erreur lorsque vous essayez d'appeler:Android SQLite ContextWrapper.openOrCreateDatabase() nullpointer?

ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) (see stacktrace below). 

J'ai créé un classe pour gérer le contexte, qui renverra le contexte de mon activité si elle n'est pas nulle, ou un faux que j'ai créé si le contexte de l'activité est nul - et le contexte de l'activité est nul, donc le faux est utilisé , mais je n'en ai aucune idée. Dans mon activité j'ai un constructeur qui donne une référence de lui-même à la classe contexthandling, mais il semble que l'activité n'est pas instanciée (pas avant que le service soit démarré au moins) quand le système redémarre mon service.

Il n'y a bien sûr aucun problème lorsque le programme est démarré normalement, le service démarre alors bien; ce qui est la raison pour laquelle je soupçonnais le contexte faux, je l'ai créé comme suit (et il est référencé dans la balise d'application manifeste avec android:name=FakeContext):

public class FakeContext extends android.app.Application 
{ 
    private static FakeContext m_instance = null; 

    public FakeContext() 
    { 
    } 

    public static synchronized Context getContext() 
    { 
     if(m_instance == null) 
     { 
     m_instance = new FakeContext(); 
     } 

     return m_instance; 
    } 
} 

Stacktrace:

11-18 19:12:14.048: ERROR/AndroidRuntime(15655): FATAL EXCEPTION: main 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): java.lang.RuntimeException: Unable to create service sdo.GeoTracker.Services.DataService: java.lang.NullPointerException 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at android.app.ActivityThread.handleCreateService(ActivityThread.java:3140) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at android.app.ActivityThread.access$3300(ActivityThread.java:135) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2202) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at android.os.Looper.loop(Looper.java:144) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at android.app.ActivityThread.main(ActivityThread.java:4937) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at java.lang.reflect.Method.invokeNative(Native Method) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at java.lang.reflect.Method.invoke(Method.java:521) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at dalvik.system.NativeStart.main(Native Method) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): Caused by: java.lang.NullPointerException 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at sdo.GeoTracker.DataAccess.SqlAdapter.<init>(SqlAdapter.java:51) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at sdo.GeoTracker.DataAccess.SqlAdapter.getInstance(SqlAdapter.java:61) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at sdo.GeoTracker.Services.DataService.startService(DataService.java:65) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at sdo.GeoTracker.Services.DataService.onCreate(DataService.java:40) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): at android.app.ActivityThread.handleCreateService(ActivityThread.java:3125) 
11-18 19:12:14.048: ERROR/AndroidRuntime(15655): ... 10 more 

Toute aide est grandement appréciée ! - Je suis un débutant au développement android, alors s'il vous plaît l'épeler.

+0

pourquoi avez-vous un faux contexte? – apps

+0

bonjour, j'avais besoin de nourrir le sqlliteopenhelper un contexte. comme ceci: OpenHelper classe private static étend SQLiteOpenHelper \t { \t \t OpenHelper publique (contexte de contexte) \t \t {\t \t \t \t \t \t \t \t super (contexte, DATABASE_NAME, null, Database_Version); \t \t} ..snip .. – SimonDK

+0

http://stackoverflow.com/questions/4177731/android-comment-call-method-from-another-class-without-passing-context/4177776#4177776 – apps

Répondre

1

La classe Application fait partie du framework Android, vous ne pouvez pas le créer avec un constructeur et ainsi de suite. Utilisez l'objet Application de votre application, au lieu d'utiliser un "faux"

+0

Bonjour, mais comment puis-je obtenir l'objet d'application? J'ai essayé d'enregistrer une version statique de ma classe d'activité (je n'ai pas une extension d'application), et la classe d'activité n'a pas été instanciée avant que le service soit démarré. – SimonDK

+0

passez l'Application, c'est toujours un Contexte – apps