2010-11-18 50 views
1

我已經創建了一個帶有服務的程序 - 服務是「START_STICKY」。所以,當我關閉程序(我用的高級任務殺手,殺程序)的服務自動重新啓動,但因爲我得到一個錯誤這提出了一個問題,當試圖撥打:Android SQLite ContextWrapper.openOrCreateDatabase()nullpointer?

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

我創建了一個類來處理上下文,如果它不爲null,它將返回我的Activity的上下文,或者如果活動的上下文爲空,則創建一個假的,並且該活動的上下文爲空,因此使用假的,我懷疑這可能是問題,但不知道。 在我的活動中,我有一個構造函數,它爲contexthandling類提供了一個自我引用,但是當系統重新啓動我的服務時,似乎沒有實例化活動(至少在服務未啓動之前)。

當程序剛剛正常啓動時,當然沒有問題,服務開始正常;這就是爲什麼我懷疑假背景下,我創建它,如下所示(以及它與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; 
    } 
} 

堆棧跟蹤:

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 

任何幫助是極大的讚賞! - 我是android開發的初學者,所以請把它拼出來。

+0

爲什麼你有假的背景? – apps 2010-11-18 21:00:47

+0

你好,我需要爲sqlliteopenhelper提供一個上下文。這樣的:私有靜態類OpenHelper擴展SQLiteOpenHelper \t { \t \t公共OpenHelper(上下文的背景下) \t \t {\t \t \t \t \t \t \t \t超(背景下,DATABASE_NAME,空,DATABASE_VERSION); \t \t} ..snip .. – SimonDK 2010-11-18 21:02:43

+0

http://stackoverflow.com/questions/4177731/android-how-to-call-method-from-another-class-without-passing-context/4177776#4177776 – apps 2010-11-18 21:05:25

回答

1

Application類是Android框架的一部分,您不能只使用構造函數等來創建它。使用應用程序的應用程序對象,而不是使用「假」背景

+0

你好,但我如何獲得應用程序對象的持有?我嘗試保存我的活動類的靜態版本(我沒有一個擴展的應用程序),並且該活動類未在服務啓動之前實例化。 – SimonDK 2010-11-18 21:06:50

+0

傳遞它的應用程序,它仍然是一個上下文 – apps 2010-11-18 21:08:07